最近需要做一些自然语言处理的工作, 发现google推出的wrod2vec比较有意思,据说可以推算出king + man - woman = queue,感觉很nb啊, 后续可以拿来做文本分类、情绪分析、关键词提取等。本文记录一下在中文wiki语料库上做的实验。
word2vec下载安装
自从google推出了word2vec后,网上已经有众多实现,包括:
我选用Gensim版本,python3.5.2。
数据集简介
我们用的是中文wiki语料库,下载链接https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2,有1.3G, 解压之后是一个5.7G左右的xml文档。里面包含了标题、分类、正文部分等。
数据预处理
上一步解压之后的xml文档我们没法直接用, 需要经过一系列的处理, 包括xml标签去除, 编码转换、简繁体转换、分词等。
xml内容提取
你可以自己写正则表达式提取内容, 当然这个太费事了。 好在已经有人做了这个事情, Gensim里自带了提取wiki内容的工具,代码如下:
代码在我的macpro上大概了运行了20多分钟, 得到280819行的文本, 每行为一篇文章。有个坑大家要小心, 输入文件是压缩文件bz2,直接传解压缩之后的xml文件是会报错的。
另外, 我为了简洁,把不相关代码删除了,因此贴出来的代码,并不符合编程的最佳实践,请自行忽略这个问题。
简繁体换过
由于wiki语料库里简体、繁体都有,不统一的话对后面分词和跑模型准确率有影响, 所以先统一转化为简体。用到的工具是opencc。
话说作者BYVoid也是超级大神, 据说小时候玩电脑,出现乱码, 于是自己写了opencc,然后提交给Linus, 被整合到linux kernel里了,那时候应该是小学还是初中吧。后来本科毕业去阿里面试,得到青睐,晚上流传了当时的面试记录。
编码转化
网上说文件中包含非utf-8字符,需要用iconv处理一下。我忘了我之前在全量数据上跑得时候有没有遇到, 反正写文章的时候,我拿了1/10的数据跑没遇到问题。如果遇到了可以用iconv一行命令解决:
分词
接下来就是做分词,比较好用的工具有结巴分词、中科院的ICTCLAS、清华的THULAC、复旦的FudanNLP等。我选用了结巴,代码如下:
又跑几十分钟, 喝杯茶去。。。
Gensim跑模型训练
终于可以跑模型了,这次时间会更长,看你的电脑配置了,强烈建议约个妹纸出去看看电影逛逛街再回来等。据同事说,gensim有一个坑,在windows下不能用多核?!!!于是我在我的8核macpro下跑一个多小时的,他在windows下要跑七八个小时,哈哈哈哈。。。
这里用save_word2vec_format纯粹是为了看看输出的模型是什么样子的, 这样:
即每个词一行, 后面是400个数字, 即将每一个词变为一个400维的向量。
看看效果
看看跟杜甫相关的词呢:
|
|
|
|
还有没有觉得这个可以拿来干点有意思的事情呢?比如:
请尽情发挥想象。。。。。。。。。。。。。。。。
其他
列几个word2vec的用途。
- 情感分析 http://datartisan.com/article/detail/48.html
- SEO https://seofangfa.com/seo-articles/word2vec.html
另外,如果想深入了解word2vec的原理, 可以看最初的论文Distributed Representations of Words and Phrases
and their Compositionality,以及有道的这篇分析。
如果想自己动手实现word2vec的话, 可以考虑用当前最热的深度学习框架TensorFlow来实现, 官网上有详细地介绍。
参考资料
- http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C
- https://radimrehurek.com/gensim/models/word2vec.html
- https://code.google.com/archive/p/word2vec/
- http://licstar.net/archives/262
- https://github.com/fxsjy/jieba
- http://thulac.thunlp.org/
- http://arxiv.org/pdf/1310.4546.pdf
- https://www.tensorflow.org/tutorials/word2vec
- http://techblog.youdao.com/?p=915
- http://blog.csdn.net/zhaoxinfan/article/details/11069485
- http://cikuapi.com/index.php