word2vec gensim 中文处理 小试牛刀

word2vec-gensim介绍

gensim 是word2vec的python实现。
word2vec是google的一个开源工具,能够计算出词与词之间的距离。
word2vec即是word to vector的缩写,一个word to vector的处理技术或模型通常被称为“Word Representation”或“Word Embedding”
word2vec使用深度学习的方式进行训练得出词向量。其相关原理可以直接搜索关键字“word2vec”了解。

小实验介绍

得到的这个词向量在NLP 相关的工作中大有可为,比如聚类、找同义词、词性分析等等。下面我们就来用它处理一些中文语料来测验一下它的功能。

英文语料有一些很不错的已经训练好的模型,可以直接用。但中文方面我并没有找到合适的,于是自己下载了近100M的语料(主要是古诗文和金庸,古龙的小说),语料偏古文,因为我最终要用它来根据一句诗生成一句近似的新诗。
比如input:“相期乃不浅” ,它会得到output:“相期乃未浅”。
数据集虽小,但最终效果并不是很差(取决于输入的诗句),所以拿出来晒晒。

代码

代码很简单,就三个函数:
* txt2unicode() 将所有语料变成一个单行组成的list(即line_list),文字全部转为unicode;
* uni_line_list2gen_model()将上一步生成的line_list用来生成一个gensim model;
* replace_word()使用gensim model来生成新诗。

txt2unicode()

第3行,设置默认编码为‘utf-8’,python的中文编码是个麻烦事,这样设置会方便很多。
第8行,gensim需要先安装。
16-20行,得到一个文件夹下所有子文件的路径。
29-36行,下载的语料有些事gbk编码,有些是gb13030, 读取后需要先解码,得到unicode。
相关语料可以去我的网盘下载:https://pan.baidu.com/s/1eSgCRSI

uni_line_list2gen_model()

第2行,先调用上一个函数,得到由行文本(unicode)组成的list。
第3行,得到一个由全部语料组成的unicode文本数据。
gensim语料输入格式是:将单个句子分成词或字组成一个list,在由所有句子对应的list组成一个总list作为输入。比如,[[u’语’, u’料’, u’库’],[u’词’, u’项’, u’量’],…],所以:
7-11行,将语料分割成句。
第15行,直接将一个unicode句子,变成一个分字的list。在英文中并没有字的概念只有词,而且都是有空格分开的,处理起来很方便,但中文涉及到要分字还是分词的选择,似乎分词更流行一些,然而常用的字(仅几千字)比常用词要少,而且常用汉字比常用的英文单词也要少很多,这是一个优势。最主要的我们这个小实验是基于古文语料,所以我这里就采用分子的方式,如果要分词可以找一些中文分词的库。
19,20行,这样就得到了一个gensim model,将其保存为文件备用。
到这里已经可以使用这个词向量模型了,直接使用model[u’字’]就可以得到这个字的向量,使用model.most_similar(positive=[u’字’], topn=10) 就可以得到根‘字’这个字最相近的十个字,并且带有距离值,更多用法可以参见gensim的API和教程。

replace_word()

第6行,b的格式是一个包含两个tuple的list,tuple由相应的字和其相似度组成。
后面的步骤看起来有点重复,其实可以用python内置的方法处理,更简单。但是,似乎小批次的重复操作,写for循环比用内置的方法更快些(待确认)。


  • 语料库中三国演义和古诗词我都复制成了三份,算是增加这些内容的权重吧。尽管如此,总文件才100M,如果想得到更精确的gensim model,则需要更大的语料库。
  • 想要更好的使用gensim,就需要理解word2vec的原理,这样在查看gensim相关资料时也更轻松。
  • python处理中文需要对编码问题有比较好的理解,最好对这一块系统性的学习。
  • 在大数据的处理过程中,大部分时间都耗在了跑程序上,要尽量使用python内置的函数和一些常用库,能够很大程度地提升速度,且代码更简洁。

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注