環境: win7+python3.5
1. 下載wiki中文分詞語料 使用迅雷下載會快不少,大小為1個多G
2.
安裝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 importWikiCorpus
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 importWikiCorpus
from gensim.models importWord2Vec
from gensim.models.word2vec importLineSentence
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. 測試訓練好的模型
結果如下:
但是呀,這個語句改成這樣:

得到的結果卻是:
難道這個模型宮斗劇看多了,發現皇上和太后是一家人,低階的后宮女人是一團,只有皇后是個另類?

剩下的,各位自己去調戲吧,應該樂趣不少~