基于搜狐新闻数据【完整版】训练中文word2vec模型

下载语料库

进入搜狗实验室下载搜狐新闻数据,得到的是news_sohusite_xml.full.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>" > corpus_seg.txt

转换完后的数据如下:

 基于搜狐新闻数据【完整版】训练中文word2vec模型

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

接着下面一个操作就是进行分词,使用jieba分词来进行分词操作,生成分词文件corpus_seg.txt,在pycharm控制台运行如下命令:

python word_segment.py corpus.txt corpus_seg.txt

 

# word_segment.py用于语料分词

import logging
import os.path
import sys
from imp import reload
import re
import jieba
reload(sys)
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,encoding='UTF-8') #加入编码
    foutput = open(outp,'w',encoding='UTF-8') #加入编码
    for line in finput:
        line_seg = jieba.cut(reTest(line))
        foutput.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")
跑起来如下:

 基于搜狐新闻数据【完整版】训练中文word2vec模型

 基于搜狐新闻数据【完整版】训练中文word2vec模型

分完词的样子:

 基于搜狐新闻数据【完整版】训练中文word2vec模型

训练word2vec

我们用gensim中的word2vec工具训练,在pycharm控制台运行如下命令:

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

#  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]) #os.path.basename表示返回path最后的文件名;sys.argv[0]表示传递命令行参数,参数train_word2vec_model.py为argv[0]
    logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    logging.root.setLevel(level=logging.INFO) ##
    logging.info("running %s" % ' '.join(sys.argv)) #info表示打印,Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
    if len(sys.argv) < 4:
        print (globals()['__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.cpu_count()) #.window是句子中当前词与目标词之间的最大距离
    model.save(outp) #训练后的模型保存;# 以二进制格式存储
    model.wv.save_word2vec_format(outp2,binary=False) # 以文本格式存储, 一行是一个词的vector

测试效果

pycharm中输入python命令。

接着依次输入:

import gensim

model = gensim.models.Word2Vec.load('corpus.model')

result = model.most_similar(u'东北大学')

for word in result:  print word[0],word[1]

输出如下:

 基于搜狐新闻数据【完整版】训练中文word2vec模型