加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

NLP系列之自主动手训练中文word2vec模型

发布时间:2022-07-01 15:36:36 所属栏目:安全 来源:互联网
导读:训练语料 word2vec的算法是公开的,word2vec模型的质量完全取决于训练语料的质量。目前免费开放的预料不多,中文语料更是凤毛麟角。 通常使用搜狐新闻数据即可,该数据来自搜狐新闻2012年6月7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提
  训练语料
  word2vec的算法是公开的,word2vec模型的质量完全取决于训练语料的质量。目前免费开放的预料不多,中文语料更是凤毛麟角。
 
  通常使用"搜狐新闻数据"即可,该数据来自搜狐新闻2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL和正文信息。
 
  数据格式
  <doc>
 
  <url>页面URL</url>
 
  <docno>页面ID</docno>
 
  <contenttitle>页面标题</contenttitle>
 
  <content>页面内容</content>
 
  </doc>
  注意:content字段去除了HTML标签,保存的是新闻正文文本
 
  数据文件
  搜狐新闻数据区根据文件格式和数据规模细分为以下几种:
 
  迷你版(样例数据, 110KB):tar.gz格式,zip格式
 
  完整版(648MB):tar.gz格式,zip格式
 
  历史版本:2008版(6KB):完整版(同时提供硬盘拷贝,65GB):tar.gz格式
 
  数据预处理
  提取中文内容
  原始数据中包含完整的html文件,所以需要提取其中的中文内容,通常提取其中<content>标签包含的内容即可。
 
  tar -zxvf news_sohusite_xml.full.tar.gz
  cat news_sohusite_xml.dat | iconv -f gb18030 -t utf-8 | grep "<content>" > news_sohusite.txt
  sed -i "" 's/<content>//g' news_sohusite.txt
  sed -i "" 's/</content>//g' news_sohusite.txt
  其中iconv命令的格式为:
 
  iconv -f encoding [-t encoding] [inputfile]...
  参数含义为:
 
  -f encoding :把字符从encoding编码开始转换。
  -t encoding :把字符转换到encoding编码。
  -l :列出已知的编码字符集合
  -o file :指定输出文件
  -c :忽略输出的非法字符
  -s :禁止警告信息,但不是错误信息
  --verbose :显示进度信息
  -f和-t所能指定的合法字符在-l选项的命令里面都列出来了
  中文切词
  与处理英文不同,中文没有切词,需要使用jieba进行切词处理。
 
  python -m jieba -d ' ' news_sohusite.txt > news_sohusite_cutword.txt
  训练word2vec
  完成预处理后,即可以利用gensim库进行训练。
 
  def train_word2vec(filename):
      #模型文件不存在才处理
      if not os.path.exists(word2vec_file):
          sentences = LineSentence(filename)
          #sg=0 使用cbow训练, sg=1对低频词较为敏感
          model = Word2Vec(sentences,
                           size=n_dim, window=5, min_count=2, sg=1, workers=2)
          model.save(word2vec_file)
  Word2Vec函数常见的几个参数含义如下:
 
  sentences表示需要处理的语料
  size表示word2vec的维数,一般50-300
  window表示处理word时的窗口长度
  min_count表示处理分析的word出现的最小次数
  sg为1表示使用skip-gram算法,为0为cbow
  workers表示计算使用的线程数
  iter表示迭代计算的次数
  使用word2vec处理中文
  把一个中文句子使用词向量表示的方法。对于类似短信、微博、标题这些长度较短的文字,可以使用各个word的word2vec相加取平均来表示。对训练数据集创建词向量,接着进行比例缩放(scale)。
 
  def buildWordVector(imdb_w2v,text, size):
      vec = np.zeros(size).reshape((1, size))
      count = 0.
      #print text
      for word in text.split():
          #print word
          try:
              vec += imdb_w2v[word].reshape((1, size))
              count += 1.
          except KeyError:
              print word
              continue
      if count != 0:
          vec /= count
      return vec
  当需要把中文数据集X转换成word2vec,可以使用如下方式。
 
  #加载训练好的词向量模型
  model = Word2Vec.load(word2vec_file)
 
  x_vecs = np.concatenate([buildWordVector(model,z, n_dim) for z in x])
  x_vecs = scale(x_vecs)
  测试效果
  下面我们测试生成的word2vec模型的质量。
 
  寻找近义词
  寻找近义词是word2vec的一个应用场景。
 
  百度的近义词
  print pd.Series(model.most_similar(u'百度'))
  0      (网易, 0.844283640385)
  1    (搜索引擎, 0.822018146515)
  2      (腾讯, 0.774820387363)
  3       (搜狗, 0.76777946949)
  4      (新浪, 0.760137319565)
  5      (奇虎, 0.745484173298)
  6      (文库, 0.725166857243)
  7    (手机软件, 0.717750906944)
  8       (优酷, 0.70574760437)
  9      (客户端, 0.70448333025)
  微信的近义词
  print pd.Series(model.most_similar(u'微信'))
  0     (摇一摇, 0.768034994602)
  1      (陌陌, 0.763847649097)
  2    (网上聊天, 0.751431167126)
  3    (聊天工具, 0.731707036495)
  4      (盗号, 0.722806692123)
  5      (飞聊, 0.715048789978)
  6      (手机, 0.706719994545)
  7     (发短信, 0.704942345619)
  8      (聊天, 0.691777765751)
  9    (账号密码, 0.679741084576)
  单词运算
  word2vec的一个神奇之处就是把文字转换成了数字,数字之间的加减运算,同样适用于word2vec。
 
  足球+明星
  print pd.Series(model.most_similar(positive=[u'足球'+u'明星']))
  0      (巨星, 0.741350233555)
  1    (光芒万丈, 0.727712750435)
  2     (和亨利, 0.722848057747)
  3      (球星, 0.722578346729)
  4       (已贵, 0.71345859766)
  5     (格米利, 0.694822609425)
  6     (支斯篮, 0.690492749214)
  7      (田坛, 0.689639627934)
  8      (体坛, 0.689606904984)
  9     (竞神锋, 0.684816122055)
  球星-明星
  print pd.Series(model.most_similar(positive=[u'球星'],negative=[u'明星']))
  dtype: object
  0    (国际米兰, 0.492849290371)
  1      (中锋, 0.480526059866)
  2      (球员, 0.479797780514)
  3     (上赛季, 0.479528963566)
  4      (主帅, 0.479275196791)
  5      (球队, 0.477513790131)
  6     (德里奇, 0.474446773529)
  7     (热那亚, 0.472252100706)
  8      (中场, 0.459134191275)
  9       (巴萨, 0.45858669281)
  比较单词的相似度
  比较微信和陌陌
  print model.wv.similarity(u'微信', u'陌陌')
  0.763847656891
  比较男人和坏人
  print model.wv.similarity(u'男人', u'坏人')
  0.617036796702

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读