NLP之自己动手训练中文word2vec模型

Posted 兜哥带你学安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP之自己动手训练中文word2vec模型相关的知识,希望对你有一定的参考价值。


NLP之自己动手训练中文word2vec模型


训练语料

word2vec的算法是公开的,word2vec模型的质量完全取决于训练语料的质量。目前免费开放的预料不多,中文语料更是凤毛麟角。

NLP之自己动手训练中文word2vec模型

这里推荐使用搜狗实验室的中文语料,对应的网址为:

 
   
   
 
  1. http://www.sogou.com/labs/resource/cs.php

通常使用"搜狐新闻数据"即可,该数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL和正文信息。

数据格式

 
   
   
 
  1. <doc>

  2. <url>页面URL</url>

  3. <docno>页面ID</docno>

  4. <contenttitle>页面标题</contenttitle>

  5. <content>页面内容</content>

  6. </doc>

注意:content字段去除了html标签,保存的是新闻正文文本

数据文件

搜狐新闻数据区根据文件格式和数据规模细分为以下几种:

  • 迷你版(样例数据, 110KB):tar.gz格式,zip格式

  • 完整版(648MB):tar.gz格式,zip格式

  • 历史版本:2008版(6KB):完整版(同时提供硬盘拷贝,65GB):tar.gz格式

数据预处理

提取中文内容

原始数据中包含完整的html文件,所以需要提取其中的中文内容,通常提取其中 <content>标签包含的内容即可。

 
   
   
 
  1. tar -zxvf news_sohusite_xml.full.tar.gz

  2. cat news_sohusite_xml.full.tar.gz | iconv -f gb18030 -t utf-8 | grep "<content>" > news_sohusite.txt

  3. sed -i "" 's/<content>//g' news_sohusite.txt

  4. sed -i "" 's/<\/content>//g' news_sohusite.txt

其中iconv命令的格式为:

 
   
   
 
  1. iconv -f encoding [-t encoding] [inputfile]...

参数含义为:

  • -f encoding :把字符从encoding编码开始转换。

  • -t encoding :把字符转换到encoding编码。

  • -l :列出已知的编码字符集合

  • -o file :指定输出文件

  • -c :忽略输出的非法字符

  • -s :禁止警告信息,但不是错误信息

  • --verbose :显示进度信息

  • -f和-t所能指定的合法字符在-l选项的命令里面都列出来了

中文切词

与处理英文不同,中文没有切词,需要使用jieba进行切词处理。

 
   
   
 
  1. python -m jieba -d ' ' news_sohusite.txt > news_sohusite_cutword.txt

训练word2vec

完成预处理后,级可以利用gensim库进行训练。

 
   
   
 
  1. def train_word2vec(filename):

  2.    #模型文件不存在才处理

  3.    if not os.path.exists(word2vec_file):

  4.        sentences = LineSentence(filename)

  5.        #sg=0 使用cbow训练, sg=1对低频词较为敏感

  6.        model = Word2Vec(sentences,

  7.                         size=n_dim, window=5, min_count=2, sg=1, workers=2)

  8.        model.save(word2vec_file)

  • sentences表示需要处理的语料

  • size表示word2vec的维数,一般50-300

  • window表示处理word时的窗口长度

  • min_count表示处理分析的word出现的最小次数

  • sg为1表示使用skip-gram算法,为0为cbow

  • workers表示计算使用的线程数

  • iter表示迭代计算的次数

使用word2vec处理中文

把一个中文句子使用词向量表示的方法。对于类似短信、微博、标题这些长度较短的文字,可以使用各个word的word2vec相加取平均来表示。对训练数据集创建词向量,接着进行比例缩放(scale)。

 
   
   
 
  1. def buildWordVector(imdb_w2v,text, size):

  2.    vec = np.zeros(size).reshape((1, size))

  3.    count = 0.

  4.    #print text

  5.    for word in text.split():

  6.        #print word

  7.        try:

  8.            vec += imdb_w2v[word].reshape((1, size))

  9.            count += 1.

  10.        except KeyError:

  11.            print word

  12.            continue

  13.    if count != 0:

  14.        vec /= count

  15.    return vec

当需要把中文数据集X转换成word2vec,可以使用如下方式。

 
   
   
 
  1. #加载训练好的词向量模型

  2. model = Word2Vec.load(word2vec_file)

  3. x_vecs = np.concatenate([buildWordVector(model,z, n_dim) for z in x])

  4. x_vecs = scale(x_vecs)

测试效果

下面我们测试生成的word2vec模型的质量。

寻找近义词

寻找近义词是word2vec的一个应用场景。

百度的近义词

 
   
   
 
  1. print pd.Series(model.most_similar(u'百度'))

  2. 0      (网易, 0.844283640385)

  3. 1    (搜索引擎, 0.822018146515)

  4. 2      (腾讯, 0.774820387363)

  5. 3       (搜狗, 0.76777946949)

  6. 4      (新浪, 0.760137319565)

  7. 5      (奇虎, 0.745484173298)

  8. 6      (文库, 0.725166857243)

  9. 7    (手机软件, 0.717750906944)

  10. 8       (优酷, 0.70574760437)

  11. 9      (客户端, 0.70448333025)

微信的近义词

 
   
   
 
  1. print pd.Series(model.most_similar(u'微信'))

  2. 0     (摇一摇, 0.768034994602)

  3. 1      (陌陌, 0.763847649097)

  4. 2    (网上聊天, 0.751431167126)

  5. 3    (聊天工具, 0.731707036495)

  6. 4      (盗号, 0.722806692123)

  7. 5      (飞聊, 0.715048789978)

  8. 6      (手机, 0.706719994545)

  9. 7     (发短信, 0.704942345619)

  10. 8      (聊天, 0.691777765751)

  11. 9    (账号密码, 0.679741084576)

单词运算

word2vec的一个神奇之处就是把文字转换成了数字,数字之间的加减运算,同样适用于word2vec。

足球+明星

 
   
   
 
  1. print pd.Series(model.most_similar(positive=[u'足球'+u'明星']))

  2. 0      (巨星, 0.741350233555)

  3. 1    (光芒万丈, 0.727712750435)

  4. 2     (和亨利, 0.722848057747)

  5. 3      (球星, 0.722578346729)

  6. 4       (已贵, 0.71345859766)

  7. 5     (格米利, 0.694822609425)

  8. 6     (支斯篮, 0.690492749214)

  9. 7      (田坛, 0.689639627934)

  10. 8      (体坛, 0.689606904984)

  11. 9     (竞神锋, 0.684816122055)

球星-明星

 
   
   
 
  1. print pd.Series(model.most_similar(positive=[u'球星'],negative=[u'明星']))

  2. dtype: object

  3. 0    (国际米兰, 0.492849290371)

  4. 1      (中锋, 0.480526059866)

  5. 2      (球员, 0.479797780514)

  6. 3     (上赛季, 0.479528963566)

  7. 4      (主帅, 0.479275196791)

  8. 5      (球队, 0.477513790131)

  9. 6     (德里奇, 0.474446773529)

  10. 7     (热那亚, 0.472252100706)

  11. 8      (中场, 0.459134191275)

  12. 9       (巴萨, 0.45858669281)

比较单词的相似度

比较微信和陌陌

 
   
   
 
  1. print model.wv.similarity(u'微信', u'陌陌')

  2. 0.763847656891

比较男人和坏人

 
   
   
 
  1. print model.wv.similarity(u'男人', u'坏人')

  2. 0.617036796702


NLP之自己动手训练中文word2vec模型

NLP系列文章



NLP之自己动手训练中文word2vec模型

NLP之自己动手训练中文word2vec模型  
机器学习入门       

主要以机器学习常见算法为主线,利用生活中的例子和具体安全场景来介绍机器学习常见算法,是机器学习入门书籍,便于读者可以快速上手。


NLP之自己动手训练中文word2vec模型  
深度学习实战      

本书将重点介绍深度学习,并以具体的11个案例介绍机器学习的应用,定位是面向具有一定机器学习基础或者致力于使用机器学习解决工作中问题的读者。


NLP之自己动手训练中文word2vec模型  
强化学习与GAN   

重点介绍强化学习和生成对抗网络的基础知识和实际应用,从AI攻防的基础知识,到智能工具的打造,全面介绍如何使用AI做建设的方法。

NLP之自己动手训练中文word2vec模型

NLP之自己动手训练中文word2vec模型



以上是关于NLP之自己动手训练中文word2vec模型的主要内容,如果未能解决你的问题,请参考以下文章

NLP实战 | 使用《人民的名义》的小说原文训练一个word2vec模型

自然语言处理开源书籍

word2vec模型之Skip-Gram Model

自然语言(NLP)处理流程—IF-IDF统计—jieba分词—Word2Vec模型训练使用

NLP之——Word2Vec详解

动手学pytorch-词嵌入预训练模型Glove