环境:
Win10 +Anaconda(自带Python3.6)
IDE:
Pycharm (其Interperter使用的是Anaconda自带的Python3.6)
安装Gensim库:
在Anaconda Prompt中输入:
pip install gensim
等待其显示安装完毕即可
1.首先获取维基百科语料库资源
我是在其中下载的当时最新的压缩文件
注:文件名在网站中的结尾为xml.bz2
2.将wiki的xml文件处理成正常的txt文件
需要用特殊的脚本处理而不能直接压缩(与维基百科保存格式有关)
github中有更为全面的WikiExtractor
有兴趣可以去研究一下
此处直接使用普通压缩文件to txt处理脚本即可
代码如下:
-
import logging
-
import os.path
-
import sys
-
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(globals()[
'__doc__'] % locals())
-
sys.exit(
1)
-
inp, outp = sys.argv[
1:
3]
-
space =
b' '
-
i =
0
-
output = open(outp,
'w',encoding=
'utf-8')
-
wiki = WikiCorpus(inp, lemmatize=
False, dictionary={})
-
for text
in wiki.get_texts():
-
s = space.join(text)
-
s = s.decode(
'utf8') +
"\n"
-
output.write(s)
-
i = i +
1
-
-
logger.info(
"Saved " + str(i) +
" articles")
-
output.close()
-
logger.info(
"Finished Saved " + str(i) +
" articles")
使用process.py脚本(即以上代码) 将维基百科的下载文件转化成text文件
在命令行中输入
python process.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text
就可以看到正在解压的过程了,过程还是需要不少时间的
部分生成结果:
需要注意
文件可能过大而无法打开
3.使用opencc将繁体txt转换为简体txt
下载地址:
无需安装,解压即可使用
将我们前面生成的wiki.zh.text拖动至opencc-1.0.1-win64文件夹中,打开cmd并在当前文件夹中输入如下指令:
opencc -i wiki.zh.text -o wiki.zh.jian.text -c t2s.json
这一步骤非常快,我只用了1分钟不到
然后可以看到目录中生成了wiki.zh.jian.text文件
打开后可以查看其中内容
可以看到已经成功全部转化为了简体字
但是做词向量训练之前仍缺少最后一步,就是分词
4.分词
英文中空格就已经将其句子分词完毕
而中文就相对复杂,但我们可以借助jieba库来分词
在Testjieba.py中分词
打开wiki.zh.jian.text,从该文件中一行行读取简体字并进行分词,分词结果放在zh.jian.wiki.seg.txt中
代码如下:
-
import jieba
-
import jieba.analyse
-
import jieba.posseg
as pseg
-
import codecs, sys
-
def cut_words(sentence):
-
#print sentence
-
return
" ".join(jieba.cut(sentence)).encode(
'utf-8')
-
-
-
f = codecs.open(
'wiki.zh.jian.text',
'r', encoding=
"utf8")
-
target = codecs.open(
"zh.jian.wiki.seg.txt",
'w', encoding=
"utf8")
-
print(
'open files')
-
line_num =
1
-
line = f.readline()
-
while line:
-
print(
'---- processing ', line_num,
' article----------------')
-
line_seg =
" ".join(jieba.cut(line))
-
target.writelines(line_seg)
-
line_num = line_num +
1
-
line = f.readline()
-
f.close()
-
target.close()
-
exit()
-
while line:
-
curr = []
-
for oneline
in line:
-
#print(oneline)
-
curr.append(oneline)
-
after_cut = map(cut_words, curr)
-
target.writelines(after_cut)
-
print(
'saved', line_num,
'articles')
-
exit()
-
line = f.readline1()
-
f.close()
-
target.close()
每一行读入后进行每一行的分词
直接运行该py文件即可(注意将 在opencc文件夹中生成的wiki.zh.jian.text放入Testjieba.py所在文件夹)
查看分词结果如下:
5.进行词向量训练
创建词向量结果模型代码如下:
-
from __future__
import print_function
-
-
import logging
-
import os
-
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])
-
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)
其中
model = Word2Vec(LineSentence(inp), size=200, window=5, min_count=5,
workers=multiprocessing.cpu_count())
代码是训练词向量的关键,定义了滑动窗口大小与最小有效词数量
并在下方保存word2vec格式的模型
在命令行中输入
python word2vec_model.py zh.jian.wiki.seg.txt wiki.zh.model wiki.zh.text.vector
源文件为zh.jian.wiki.seg.txt
目标文件为wiki.zh.model
训练时间大致为25分钟(1080Ti训练结果下)
6.测试训练模块成果
代码如下
-
from gensim.models
import Word2Vec
-
-
en_wiki_word2vec_model = Word2Vec.load(
'wiki.zh.model')
-
-
testwords = [
'孩子',
'数学',
'学术',
'白痴',
'篮球']
-
for i
in range(
5):
-
res = en_wiki_word2vec_model.most_similar(testwords[i])
-
print(testwords[i])
-
print(res)
首先导入gensim.models中的Word2Vec模块
然后使用Word2Vec模块中方法加载模块,之后便可以使用其中的most_similar方法进行词向量寻找并打印结果
测试结果展示:
总结:
可以看到还是大部分make sense的
但是也有一些词不太相近或者更相近的答案而并非首选。
很大一部分原因是因为语料库的不足,因为语料库中资料仅有1.3G,对于中文训练来说是大大不足的。