使用微博语料训练词向量

去年底通过一个叫爬盟的神奇网站获得了一些微博的语料数据。这个网站采用众包爬取的方式,每个人爬取一些数据并上传到网站上,获得自己爬取的数据和积分,再通过积分下载别人爬取的数据。这个网站从2012年开始有第一批数据,到现在已经有五年了。根据推算,总共爬取TB级的数据(目测超过10TB),估计有数十亿甚至超过百亿的数据。我慢慢的也积累了一些数据,并用这些数据训练了词向量。
我先使用正则表达式过滤出中文字符,再进行分词,最后使用gensim训练出词向量。

刚开始使用了jieba分词,分词速度很快,但是感觉效果不是很好,很多断句都是错误的。然后换用hanlp进行分词,感觉好很多,但仍然存在极少的错误。
下面使用几行代码测试一下投入了2GB语料数据训练出的词向量。这个模型文件占据大约300mb的空间。在模型文件中计算和”幸运”最相近的词,如下图所示:
1.png
可以看出和幸运最相近的词是幸运儿,然后是中奖,然后是抢手、好运、周大福、荣幸。至于为什么周大福也在列表里,我推测有可能是因为周大福在微博上做了很多广告,推送了太多内容:)。所以这里出现了使用微博数据训练语料的局限性:微博上有很多垃圾广告信息,而且数量还不少,再加上那些水军,会严重干扰计算结果。
于是我又投入了20GB语料数据进行训练,结果如下:
2.png
可以看出相关的结果多了很多,但是分词好像出现了一些问题,会出现”之城杰”等莫名其妙的词语。

总体上面来讲,中文词向量的训练比英文难很多,首先就出现在分词上面。其次还有繁体中文转简体中文的问题。最后,提高语料的规模确实有一定帮助。等抽出时间来可以把语料规模提高到100GB,去掉一些推广的内容(这个目前还没什么思路),再研究研究用那种分词方式更好。

总体上面来讲,中文词向量的训练比英文难很多,首先就出现在分词上面。其次还有繁体中文转简体中文的问题。最后,提高语料的规模确实有一定帮助。等抽出时间来可以把语料规模提高到100GB,去掉一些推广的内容(这个目前还没什么思路),再研究研究用那种分词方式更好。
接下来再看一看词向量模型文件的内容,如下图:
3.png
第一行两个数字分别是词的个数和词向量的维数,这里有1036927个词,每个词的向量维数为400维。
在这里还有一个问题,每次寻找相似的词时都要遍历计算一遍103w个词,非常耗时间,而且这个计算相似度的程序没有对多线程进行优化。如果对多线程进行优化,或者用GPU进行计算,能够大大节省时间。如果词的个数较少的话,或许可以打表。
总而言之,训练词向量并寻找相似的词是比较基础的应用。但正因如此也是比较重要的一环。像gensim给出的例子是使用维基百科进行训练,可是中文维基百科内容较少,比较担心训练出来的效果。微博语料虽然多,但是广告等无关信息也很多。如果过滤掉这些内容的话,感觉应该能够训练出比较理想的模型。或许可以尝试爬取百度百科。
相关代码以后有时间整理出来再发吧。。。