(1)中英文维基百科语料上的Word2Vec实验
(2)Wiki语料处理
旨在记录下自己亲自训练的过程
英文:https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2
中文:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
下面这段代码读取了压缩的xml文件,转换为text文本文件并去掉了标点符号
执行python3 process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text生成wiki.en.text
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Pan Yang ([email protected])
# Copyrigh 2017from __future__ import print_function
import logging
import os.path
# import six
import sys
sys.path.append("/home/qiyue/qyWindows/D/pyProjects/Wikipedia_Word2vec")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))# check and process input arguments
if len(sys.argv) != 3:
print("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.en.text")
sys.exit(1)
inp, outp = sys.argv[1:3]
space = " "
i = 0output = open(outp, 'w')
wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
for text in wiki.get_texts():
output.write(bytes(' '.join(text), 'utf-8').decode('utf-8') + '\n')
# if six.PY3:
# output.write(bytes(' '.join(text), 'utf-8').decode('utf-8') + '\n')
# # ###another method###
# # output.write(
# # space.join(map(lambda x:x.decode("utf-8"), text)) + '\n')
# else:
# 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")
处理完数据后可以进行模型的训练,代码如下
执行python3 train_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector,生成.model模型文件和.vector原始向量文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Pan Yang ([email protected])
# Copyright 2017from __future__ import print_function
import logging
import os
import sys
import multiprocessingfrom gensim.models import Word2Vec
from gensim.models.word2vec import LineSentenceif __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) < 4:
print("Useing: python train_word2vec_model.py input_text "
"output_gensim_model output_word_vector")
sys.exit(1)
inp, outp1, outp2 = sys.argv[1:4]model = Word2Vec(LineSentence(inp), size=200, window=5, min_count=5,
workers=multiprocessing.cpu_count())model.save(outp1)
model.wv.save_word2vec_format(outp2, binary=False)
核心训练代码是红色部分代码,可以根据gensim提供的api自行调整模型参数,这个博客详细解释了每个参数的意义可参考
http://blog.csdn.net/svenhuayuncheng/article/details/78751311
执行完以上两步后,就可以加载和测试模型了,有两种方式,分别加载.model和.vector
# -*- coding:utf-8 -*-
import gensim
# 加载.model文件方式
# model = gensim.models.Word2Vec.load("*.model")
# print(model.most_similar("ball"))# 加载.vector文件方式
model = gensim.models.KeyedVectors.load_word2vec_format("*.vector", binary=False)
print(model.most_similar("football"))
以上利用gensim初步完成了word2vec实验
对于中文语料,在以上步骤一和步骤二之间要加上对于中文数据的处理步骤,分三小步:
(1)预料中的繁体字转换为简体字
利用opencc工具包,一款繁简体字转换工具
笔者在ubuntu系统下直接sudo apt-get install opencc安装完成,然后在命令行运行以下代码,转换速度非常快
opencc -i fan -o jian -c */zht2zhs.ini
-i参数是输入文件 -o是转换后的输出文件 -c 是预设配置文件,代表转换设置(简到繁,繁到简等等)
(2)分词,利用jieba分词
python3 -m jieba -d ' ' input_file > output_file
(3)编码转换
iconv -c -t UTF-8 input_file -o output_file
笔者学着参考blog中把三步命令写入shell脚本文件中,直接运行.sh文件
之后就可以正常加载和测试中文词汇了