这篇作为完整的词向量模型训练过程记录~~~
一、数据获取
wiki中文:wiki中文
wiki英文:wiki英文
中文文件大小约1.3G,英文文件大小约13.8G。
二、将xml文件转换为text格式,使用gensim.corpora中的WikiCorpus函数来处理维基百科的数据,具体方法是get_texts().
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 将xml的wiki数据转换为text格式
import logging
import os.path
import sys
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim') # 忽略警告
from gensim.corpora import WikiCorpus
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))
if len(sys.argv) < 3:
print(globals()['__doc__'] % locals())
sys.exit(1)
inp, outp = sys.argv[1:3]
space = " "
i = 0
output = open(outp, 'w', encoding='utf-8')
wiki =WikiCorpus(inp, lemmatize=False, dictionary=[]) # gensim里的维基百科处理类WikiCorpus
for text in wiki.get_texts(): # 通过get_texts将维基里的每篇文章转换位1行text文本,并且去掉了标点符号等内容
output.write(space.join(text) + "\n")
i = i+1
if (i % 10000 == 0):
logger.info("Saved "+str(i)+" articles.")
output.close()
logger.info("Finished Saved "+str(i)+" articles.")
英文数据处理大约2个小时,中文大约30分钟。
三、中文繁体转简体
到以下链接地址下载对应版本的OpenCC,本人下载的版本是opencc-1.0.1-win64。https://bintray.com/package/files/byvoid/opencc/OpenCC 另外,资料显示还有python版本的,使用pip install opencc-python进行安装,未实践不做赘述。
进入解压后的opencc的目录(opencc-1.0.1-win32),双击opencc.exe文件。在txt文件所在目录下打开dos窗口(Shift+鼠标右键->在此处打开命令窗口),输入如下命令行:
opencc -i wiki.zh.txt -o wiki.zh.simp.txt -c t2s.json
则会得到文件wiki.zh.simp.txt,即转成了简体的中文。
四、中文分词
采用结巴分词对简体中文文件进行分词。由于此语料已经去除了标点符号,因此在分词程序中无需进行清洗操作,可直接分词。若是自己采集的数据还需进行标点符号去除和去除停用词的操作。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 逐行读取文件数据进行jieba分词
import jieba
import jieba.analyse
import jieba.posseg as pseg #引入词性标注接口
import codecs, sys
if __name__ == '__main__':
f = codecs.open('wiki.zh.simp.txt', 'r', encoding='utf-8')
target = codecs.open('wiki.zh.simp.seg.txt', 'w', encoding='utf-8')
print('open files.')
lineNum = 1
line = f.readline()
while line:
print('---processing ', lineNum, ' article---')
seg_list = jieba.cut(line, cut_all=False)
line_seg = ' '.join(seg_list)
target.writelines(line_seg)
lineNum = lineNum + 1
line = f.readline()
print('well done.')
f.close()
target.close()
五、训练Word2Vec模型
接下来中文分完词的文档或英文文档可进行Word2Vec模型的训练。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 使用gensim word2vec训练脚本获取词向量
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim') # 忽略警告
import logging
import os.path
import sys
import multiprocessing
from gensim.corpora import WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
if __name__ == '__main__':
# print(open('/Users/sy/Desktop/pyRoot/wiki_zh_vec/cmd.txt').readlines())
# sys.exit()
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s', level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
# inp为输入语料, outp1 为输出模型, outp2为原始c版本word2vec的vector格式的模型
fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
inp = fdir + 'wiki.zh.simp.seg.txt'
outp1 = fdir + 'wiki.zh.text.model'
outp2 = fdir + 'wiki.zh.text.vector'
# 训练skip-gram模型 sg=1
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
workers=multiprocessing.cpu_count())
# 保存模型
model.save(outp1)
model.wv.save_word2vec_format(outp2, binary=False)
过程:
结果:(英文数据建模时间较长)
六、模型测试
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 测试训练好的模型
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')# 忽略警告
import sys
# reload(sys)
# sys.setdefaultencoding('utf-8')
import gensim
if __name__ == '__main__':
fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
model = gensim.models.Word2Vec.load(fdir + 'wiki.zh.text.model')
word = model.most_similar(u"篮球")
for t in word:
print(t[0], t[1])
参考:
【1】https://github.com/AimeeLee77/wiki_zh_word2vec
【2】
http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C