在前一節,(一)利用Wikipedia中文語料訓練詞向量word2vec——獲取Wikipedia簡體中文語料庫
我們學習到了如何下載Wiki中文語料庫,並且學會了如何將繁體轉換爲簡體。在這一節中,我們將學習如何訓練word2vec,包括分詞以及訓練兩個步驟。所有的處理過程都是在jupyter notebook中進行的。
第一步 jieba分詞
import pandas as pd
import codecs
import jieba, re
其中codecs
模塊用於打開數據量大的文本文件。
%%time # 統計代碼的運行時間
# 利用codecs模塊打開大容量文本,wiki_text.txt是簡體文件
f = codecs.open('wiki_text.txt', 'r', encoding='utf-8')
# 將分詞後的文件存入target
target = codecs.open('wiki.zh.jianti.cut.words.txt', 'w', encoding='utf-8')
line_num = 1
line = f.readline() # 按行讀取
# 匹配中文分詞
zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
while line:
print('-'*8 + 'processing ', line_num, ' article' + '-'*8)
line_cut = ' '.join([word for word in jieba.cut(line) if zhPattern.search(word)])
target.writelines(line_cut)
line_num += 1
line = f.readline()
f.close()
target.close()
運行結果如下:
第二步 gensim訓練word2vec
導入相關包
import logging # 打印日誌
import gensim
import multiprocessing # 多核處理
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
相關參數:
sg=1: 使用skip-gram; sg=0: 使用cbow.
min_count 忽略所有頻率低於此值的單詞。默認值爲5。
window(int)是一個句子中當前單詞和預測單詞之間的最大距離
size表示訓練的詞向量維度
%%time
from gensim.models.word2vec import LineSentence, Word2Vec
# wiki.zh.jianti.cut.words.txt是分詞後的文本
sentences = LineSentence("wiki.zh.jianti.cut.words.txt")
# multiprocessing.cpu_count()多核CPU進行計算
model = Word2Vec(sentences, size=300, min_count=5, sg=1, window=5, workers=multiprocessing.cpu_count())
#保存模型,供日後使用
model.save("word2vec_300.model")
運行結果:(logging
模塊將會輸出程序運行日誌)。
程序運行完後,將會在本地產生模型文件:
因爲語料庫太大,訓練很耗時,本機訓練2G左右的語料,花了接近三個小時。