在搜狗实验室里下载相关语料,我下载的是全网新闻: http://www.sogou.com/labs/resource/ca.php
下下来的语料,看到有1.54G的大小: 文件大小
其中里面内容的格式为:
文本格式
刚下下来的语料是用gbk编码的,在mac或linux上都会呈乱码形式,需要将之转换为utf-8编码。而且我们只需要<content>里面的内容。因此先转换编码和获取content内容。这里简单的方法可以通过shell的命令来完成:
cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>" > corpus.txt
转换完后的数据如下: 数据语料
这时候全是content中的内容了,虽然还有<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" )
先用正则将<content>和</content>去掉
def reTest(content): reContent = re.sub('<content>|</content>','',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")
跑起来如下: 运行结果
分完词的样子: 分词完毕,<content></content>也去掉了
接着我们可以用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)
运行信息如下: 正在进行中...
完毕后,即训练出了模型,这是可以测试测试模型的效果了,进入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.588376522064 噢 0.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 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。