今天在下手写一个算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