wiki中文语料+word2vec (python3.5 windows win7)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wiki中文语料+word2vec (python3.5 windows win7)相关的知识,希望对你有一定的参考价值。
环境: win7+python3.5
1. 下载wiki中文分词语料 使用迅雷下载会快不少,大小为1个多G2. 安装opencc用于中文的简繁替换
安装exe的版本
opencc-1.0.1-win64.7z |
也可安装 python版本的:
pip install opencc-python
安装时会报错:
报错一: ImportError: No module named distribute_setup
解决方法,到 http://www.minitw.com/download/distribute_setup.zip 下载ZIP,解压后将.py文件放置到 电脑的分盘:\\你安裝Python的目录\\Lib(例如:C:\\Python35\\Lib)
报错二:chown() missing 1 required positional argument: ‘numeric_owner‘
到distribute_setup.py中,找到self.chown(tarinfo, dirpath),改为chown(tarinfo, dirpath, ‘‘);
报错三: import opencc时,报错 no module named ‘version‘
将opencc的__init__.py 中的from version import __version__改为from .version import __version__
3. 将wiki的资料转为文本txt
python process_wiki.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text
解压后得到925M的文件,由于wiki中的东西是会定期更新的,所以不同时间下载得到的大小不一样
process_wiki.py 源码如下:
注: 网上的版本大多是针对python2的,使用python3进行解压会在output.write(space.join(text) + "\\n")这一句出现提示关于byte或str的错误,所以需要有如下修改:
space = b‘ ‘ #原来是space = ‘ ‘
- ...
for text in wiki.get_texts():
s=space.join(text)
s=s.decode(‘utf8‘) + "\\n"
output.write(s)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 修改后的代码如下:
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
if (i % 10000 == 0):
logger.info("Saved " + str(i) + " articles")
output.close()
logger.info("Finished Saved " + str(i) + " articles")
4. 繁简转化
进入解压后的opencc的目录,打开dos窗口,输入
opencc -i wiki.zh.text -o wiki.zh.jian.text -c t2s.json
则会得到wiki.zh.jian.text,里面是简体的中文
此时,大家会比较好奇,里边装着的到底是什么东西~
由于解压后的txt有900多M大,用txt打开比较困难,所以我们采用python自带的IO进行读取
import codecs,sys
import opencc
f=codecs.open(‘zh.wiki.txt‘,‘r‘,encoding="utf8")
line=f.readline()
print(line)
打印的结果如下,可以看出文档中包含多干行文字,每一行文字为一篇文章,每一个空格表示此处原为一个标点符号
简体的打印结果如下:
5. 分词
由第四步得到语料仅由标点隔开,还需将其分割成词
此处使用结巴分词 pip install jieba 即可安装
结巴的具体介绍见:https://github.com/fxsjy/jieba
由于编码的原因,此处使用了codecs
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(‘zh.jian.wiki.txt‘,‘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()
分词后的文档长这个样子:
6. 训练word2vec模型
python train_word2vec_model.py zh.jian.wiki.seg.txt wiki.zh.text.model wiki.zh.text.vector
train_word2vec_model.py源码如下:
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__‘:
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 (globals()[‘__doc__‘] % locals())
sys.exit(1)
inp, outp1, outp2 = sys.argv[1:4]
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
model.save(outp1)
model.save_word2vec_format(outp2, binary=False)
训练时长,看个人的机子配置,我训了一天。。。(吐槽一下换不了的破机子)
最终得到
7. 测试训练好的模型
结果如下:
但是呀,这个语句改成这样:
得到的结果却是: 难道这个模型宫斗剧看多了,发现皇上和太后是一家人,低阶的后宫女人是一团,只有皇后是个另类?
剩下的,各位自己去调戏吧,应该乐趣不少~
以上是关于wiki中文语料+word2vec (python3.5 windows win7)的主要内容,如果未能解决你的问题,请参考以下文章
python gensim使用word2vec词向量处理英文语料
利用搜狐新闻语料库训练100维的word2vec——使用python中的gensim模块