使用搜狗新闻语料库,训练word embeding

在搜狗实验室里下载相关语料,我下载的是全网新闻: http://www.sogou.com/labs/resource/ca.php

下下来的语料,看到有1.54G的大小:

文件大小

其中里面内容的格式为:


使用搜狗新闻语料库,训练word embeding_第1张图片
文本格式

刚下下来的语料是用gbk编码的,在mac或linux上都会呈乱码形式,需要将之转换为utf-8编码。而且我们只需要里面的内容。因此先转换编码和获取content内容。这里简单的方法可以通过shell的命令来完成:

cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep ""  > corpus.txt 

转换完后的数据如下:

使用搜狗新闻语料库,训练word embeding_第2张图片
数据语料

这时候全是content中的内容了,虽然还有标签在,不过这个可以在程序中去掉。

下面一个操作就是进行分词,因为是用Python来进行的,使用jieba分词来进行分词操作,生成分词文件corpus_seg.txt:

python word_segment.py corpus.txt corpus_seg.txt

# -*- coding: utf-8 -*-
# word_segment.py用于语料分词

import logging
import os.path
import sys
import re
import jieba

reload(sys)
sys.setdefaultencoding( "utf-8" )

# 先用正则将去掉
def reTest(content):
  reContent = re.sub('|','',content)
  return reContent

if __name__ == '__main__':
  program = os.path.basename(sys.argv[0])
  logger = logging.getLogger(program)
  logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
  logging.root.setLevel(level=logging.INFO)
  logger.info("running %s" % ' '.join(sys.argv))

   # check and process input arguments
  if len(sys.argv) < 3:
    print globals()['__doc__'] % locals()
    sys.exit(1)
  inp, outp = sys.argv[1:3]
  space = " "
  i = 0

  finput = open(inp)
  foutput = open(outp,'w')
  for line in finput:
    line_seg = jieba.cut(reTest(line))
    output.write(space.join(line_seg))
    i = i + 1
    if (i % 1000 == 0):
      logger.info("Saved " + str(i) + " articles_seg")

  finput.close()
  foutput.close()
  logger.info("Finished Saved " + str(i) + " articles")

跑起来如下:

使用搜狗新闻语料库,训练word embeding_第3张图片
运行结果

分完词的样子:

使用搜狗新闻语料库,训练word embeding_第4张图片
分词完毕,也去掉了

接着我们可以用gensim中的word2vec工具训练:

python train_word2vec_model.py corpus_seg.txt corpus.model corpus.vector

# -*- coding: utf-8 -*-
# train_word2vec_model.py用于训练模型

import logging
import os.path
import sys
import multiprocessing

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

if __name__=='__main__':
  program = os.path.basename(sys.argv[0])
  logger = logging.getLogger(program)

  logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
  logging.root.setLavel(level=logging.INFO)
  logging.info("running %s" % ' '.join(sys.argv))

  if len(sys.argv) < 4:
    print global()['__doc__'] % locals()
    sys.exit(1)

  inp,outp,outp2 = sys.argv[1:4]

  model = Word2Vec(LineSentence(inp),size=400,window=5,min_count=5,workers=multiprocessing.cup_count())

  model.save(outp)
  model.save_word2vec_format(outp2,binary=false)

运行信息如下:

使用搜狗新闻语料库,训练word embeding_第5张图片
正在进行中...

完毕后,即训练出了模型,这是可以测试测试模型的效果了,进入ipython:

In [1]: import gensim

In [2]: model = gensim.models.Word2Vec.load('corpus.model')

In [3]: result = model.most_similar(u'警察')

In [4]: for word in result:
   ...:     print word[0],word[1]
   ...:

警员 0.668260276318
民警 0.566563367844
军警 0.560631096363
便衣警察 0.560409486294
保安 0.559458613396
交警 0.553144752979
协警 0.55225610733
公安人员 0.536189615726
警方 0.535990476608
警务人员 0.5125041008

In [5]: result = model.most_similar(u'妹纸')

In [6]: for word in result:
   ...:     print word[0],word[1]
   ...:

妹子 0.5883765220640.559590697289
帅哥 0.550627946854
美眉 0.549147129059
萝莉 0.534497618675
尤物 0.525674104691
小萝莉 0.517127275467
小女生 0.508114397526
妖娆 0.506700277328
美女 0.503593623638

In [7]: result = model.most_similar(u'御姐')

In [8]: for word in result:
   ...:     print word[0],word[1]
   ...:

冷艳 0.705523848534
萝莉 0.701750993729
侠女 0.645917892456
玉女 0.643954575062
百变 0.634887218475
小萝莉 0.62935769558
丑女 0.613193750381
妖娆 0.61169230938
清纯 0.608936905861
风骚 0.602776527405

In [9]: result = model.most_similar(u'马云')

In [10]: for word in result:
   ...:     print word[0],word[1]
   ...:

阿里巴巴 0.557115197182
马化腾 0.551600694656
雷军 0.495278447866
李彦宏 0.476020514965
柳传志 0.475475847721
郭台铭 0.462114006281
宋卫平 0.453877806664
阎焱 0.452617198229
周鸿祎 0.44635617733
俞敏洪 0.43476909399

In [11]: model.similarity(u'男人',u'女人')
Out[11]: 0.90834058044551369

In [12]: print model.doesnt_match(u"早餐 晚餐 午餐 计算机".split())
计算机

In [13]: model.n_similarity([u'御姐',u'萝莉'],[u'计算机',u'编程'])
Out[13]: -0.054454374940044653

通过测试,看起来效果还蛮不错的。



作者:七号萝卜
链接:https://www.jianshu.com/p/6d542ff65b1e
來源:简书

你可能感兴趣的:(机器学习)