Categories
日常应用

从词频统计到词频矩阵(善用sparse matrix)

今天在下手写一个算text similarity的程序时,万般痛恨tm包不争气,而lijian哥的tmcn包又还木有完工,所以只能自己从头开始写了...

一切正常,基本的清洗啊,全角换半角啊,分词啊,去stop words啊几行代码顺利搞定,结果统计完了每行的词频却找不到一个有效的办法来算词频矩阵!数据也就是那么几万行嘛...reshape2怎么一下子就挂了呢?研究了一番,想到就算搞出来一个几万乘几万的词频矩阵,后面的distance之类也算不出来...悲哀的感觉充斥。没办法,只能祭出sparse matrix这面大旗了!

Google之,R里面可以调用Matrix或者SparseM。鉴于前者看起来比较简单的样子,我就没有去折腾后者。Matrix里面Sparse Matrix的定义比较简单,就是记录一下值不为0的行和列编号,以及他们对应的值就可以了。等等,这个东西怎么听起来这么熟悉?!好像在network analysis里面整天写这样的程序嘛!对嘛,不就是一个edgelist格式的network(记录相互连接的边)转换为一个matrix格式的网络(边边矩阵)嘛!瞬间有种打通任督二脉的感觉....

这样,只要我数出来每篇文章中的词频就足够了! 形如:
Post_id word count
1.           A.       1
1.           B.       2

这样,然后

sparseMatrix(as.factor(data$Post_id),
as.factor(data$word),
data$count)

就ok啦。超级高效!瞬间秒杀。根本不用去算真正的词频矩阵。

附这个函数的用法:

sparseMatrix(i = ep, j = ep, p, x, dims, dimnames,
             symmetric = FALSE, index1 = TRUE,
             giveCsparse = TRUE, check = TRUE)

同样的,dim()还是可以用来看维度,一般没错的。

再后面就是考验大家具真学得好不好的时候啦。比如方差这种东西,不就是 XX'嘛(当然要先减一下均值....),这里Matrix这个包有tcrossprod()可直接算XX',colsum这些也都还有...正常的矩阵乘法也都还可以用。关键是,QR分解什么的也有!

于是乎我可以深深满足的继续码下面的分析去了...

--------------------吐槽分割线------------------
作为一个经济学出身的孩子,我做梦也没想到有一日我居然会去碰稀疏矩阵这种东西...没办法,生活所迫呀!自己动手,丰衣足食.... T_T

14 replies on “从词频统计到词频矩阵(善用sparse matrix)”

以前怎么会有动力去折腾稀疏矩阵呀....这种劳神劳力的事儿显然是坐享其成的....现在不是非得自己写不可了么。

Comments are closed.