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

环境说明:本人使用的是MacBook+python3.5     

首先,安装NLP工具包gensim,这里直接有word2vec

在终端输入下面指令:

pip install -- upgrade gensim

其次,安装中文分词工具包jieba

在终端输入下面指令:

pip install jieba

1.下载语料库

首先第一步现在搜狗语料库http://www.sogou.com/labs/resource/ca.php下载语料。

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

我下载的是完整版 tar.gz格式。

2.数据预处理

语料编码问题

刚下载的语料是用GB 18030编码的,在Mac上打不开,需要转换为UTF-8编码格式。(ps:本人小菜鸟,就因为这个问题捣腾了很久)

在Mac上不用安装额外的编码转换器。在终端操作即可。

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

我没有把全部文章都用上,因为实在太大了,我只尝试使用了100个文档。

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

编码问题搞好后,虽然文档内容里还有<content><content/>,但是这都可以用接下来的代码里删掉。下一步就是分词了。

分词代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Aug  5 19:54:54 2018

@author: tengwei
"""

# word_segment.py用于语料分词

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

importlib.reload(sys)

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

if __name__ == '__main__':
   
    # check and process input arguments
    
    #if len(sys.argv) < 3:
        #print (globals()['__doc__'] % locals())
        #sys.exit(1)

 
    space = " "
    i = 0

    finput = open('corpus.txt','r')
    foutput = open('corpus_seg.txt','w')
    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模型

3.训练word2vec

分完词下一步就是训练word2vec的模型。

训练word2vec模型代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Aug  6 18:57:23 2018

@author: tengwei
"""

import gensim.models.word2vec as w2v
model_file_name = 'corpus_model.txt'
  #模型训练,生成词向量
sentences = w2v.LineSentence('corpus_seg.txt')
model = w2v.Word2Vec(sentences, size=20, window=5, min_count=5, workers=4) 
model.save(model_file_name)

运行结果:

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

4.测试效果

模型生成后,接下来就是测试了。

测试代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Aug  8 16:01:43 2018

@author: tengwei
"""

import gensim

model = gensim.models.Word2Vec.load('corpus_model.txt')

result = model.most_similar(u'警察')

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

测试结果:

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

这是一个小实践,但是我弄了快一个星期才把它差不多弄通,希望能和大家多多交流。

QQ:453845334

邮件:[email protected]