wiki中文语料+word2vec (python3.5 windows win7),word2vecwin7,环境: win7+p


环境: win7+python3.51. 下载wiki中文分词语料 使用迅雷下载会快不少,大小为1个多G https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz22. 安装opencc用于中文的简繁替换 安装exe的版本https://bintray.com/package/files/byvoid/opencc/OpenCC中下载
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 pythonprocess_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 loggingimport os.pathimport sysfrom gensim.corpora import WikiCorpusif __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,sysimport openccf=codecs.open(‘zh.wiki.txt‘,‘r‘,encoding="utf8")line=f.readline()print(line)
打印的结果如下,可以看出文档中包含多干行文字,每一行文字为一篇文章,每一个空格表示此处原为一个标点符号技术分享
简体的打印结果如下:技术分享
5. 分词由第四步得到语料仅由标点隔开,还需将其分割成词此处使用结巴分词 pip install jieba 即可安装结巴的具体介绍见:https://github.com/fxsjy/jieba结巴分词参考了https://codesky.me/archives/ubuntu-python-jieba-word2vec-wiki-tutol.wind中的做法由于编码的原因,此处使用了codecs
import jiebaimport jieba.analyseimport jieba.posseg as psegimport codecs,sysdef 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=1line = 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 loggingimport os.pathimport sysimport multiprocessingfrom gensim.corpora import WikiCorpusfrom gensim.models import Word2Vecfrom 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 (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. 测试训练好的模型技术分享结果如下:技术分享
但是呀,这个语句改成这样:技术分享
得到的结果却是:技术分享难道这个模型宫斗剧看多了,发现皇上和太后是一家人,低阶的后宫女人是一团,只有皇后是个另类?剩下的,各位自己去调戏吧,应该乐趣不少~


























































































































来自为知笔记(Wiz)

wiki中文语料+word2vec (python3.5 windows win7)

评论关闭