基于搜狐新闻数据【完整版】训练中文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
转换完后的数据如下:
这时就全是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
我们用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])
输出如下: