這篇作爲完整的詞向量模型訓練過程記錄~~~
一、數據獲取
wiki中文:wiki中文
wiki英文:wiki英文
中文文件大小約1.3G,英文文件大小約13.8G。
二、將xml文件轉換爲text格式,使用gensim.corpora中的WikiCorpus函數來處理維基百科的數據,具體方法是get_texts().
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 將xml的wiki數據轉換爲text格式
import logging
import os.path
import sys
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim') # 忽略警告
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))
if len(sys.argv) < 3:
print(globals()['__doc__'] % locals())
sys.exit(1)
inp, outp = sys.argv[1:3]
space = " "
i = 0
output = open(outp, 'w', encoding='utf-8')
wiki =WikiCorpus(inp, lemmatize=False, dictionary=[]) # gensim裏的維基百科處理類WikiCorpus
for text in wiki.get_texts(): # 通過get_texts將維基裏的每篇文章轉換位1行text文本,並且去掉了標點符號等內容
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.")
英文數據處理大約2個小時,中文大約30分鐘。
三、中文繁體轉簡體
1)安裝OpenCC
到以下鏈接地址下載對應版本的OpenCC,本人下載的版本是opencc-1.0.1-win64。https://bintray.com/package/files/byvoid/opencc/OpenCC 另外,資料顯示還有python版本的,使用pip install opencc-python進行安裝,未實踐不做贅述。
2)使用OpenCC進行繁簡轉換
進入解壓後的opencc的目錄(opencc-1.0.1-win32),雙擊opencc.exe文件。在txt文件所在目錄下打開dos窗口(Shift+鼠標右鍵->在此處打開命令窗口),輸入如下命令行:
opencc -i wiki.zh.txt -o wiki.zh.simp.txt -c t2s.json
則會得到文件wiki.zh.simp.txt,即轉成了簡體的中文。
四、中文分詞
採用結巴分詞對簡體中文文件進行分詞。由於此語料已經去除了標點符號,因此在分詞程序中無需進行清洗操作,可直接分詞。若是自己採集的數據還需進行標點符號去除和去除停用詞的操作。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 逐行讀取文件數據進行jieba分詞
import jieba
import jieba.analyse
import jieba.posseg as pseg #引入詞性標註接口
import codecs, sys
if __name__ == '__main__':
f = codecs.open('wiki.zh.simp.txt', 'r', encoding='utf-8')
target = codecs.open('wiki.zh.simp.seg.txt', 'w', encoding='utf-8')
print('open files.')
lineNum = 1
line = f.readline()
while line:
print('---processing ', lineNum, ' article---')
seg_list = jieba.cut(line, cut_all=False)
line_seg = ' '.join(seg_list)
target.writelines(line_seg)
lineNum = lineNum + 1
line = f.readline()
print('well done.')
f.close()
target.close()
五、訓練Word2Vec模型
接下來中文分完詞的文檔或英文文檔可進行Word2Vec模型的訓練。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 使用gensim word2vec訓練腳本獲取詞向量
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim') # 忽略警告
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__':
# print(open('/Users/sy/Desktop/pyRoot/wiki_zh_vec/cmd.txt').readlines())
# sys.exit()
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s', level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
# inp爲輸入語料, outp1 爲輸出模型, outp2爲原始c版本word2vec的vector格式的模型
fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
inp = fdir + 'wiki.zh.simp.seg.txt'
outp1 = fdir + 'wiki.zh.text.model'
outp2 = fdir + 'wiki.zh.text.vector'
# 訓練skip-gram模型 sg=1
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
workers=multiprocessing.cpu_count())
# 保存模型
model.save(outp1)
model.wv.save_word2vec_format(outp2, binary=False)
過程:
結果:(英文數據建模時間較長)
六、模型測試
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 測試訓練好的模型
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')# 忽略警告
import sys
# reload(sys)
# sys.setdefaultencoding('utf-8')
import gensim
if __name__ == '__main__':
fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
model = gensim.models.Word2Vec.load(fdir + 'wiki.zh.text.model')
word = model.most_similar(u"籃球")
for t in word:
print(t[0], t[1])
參考:
【1】https://github.com/AimeeLee77/wiki_zh_word2vec
【2】
http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C