gensim訓練word2vec和doc2vec
阿新 • • 發佈:2019-01-08
word2vec和doc2vec是做NLP過程中經常使用的方法。
用向量表示詞彙這種做法由來已久,最早使用的是one-hot向量,即只有一個維度為1,其餘維度都為0,但這種做法有很多缺陷,過多的維度會導致資料處理的困難,而且這種表示方法無法體現詞所在的上下文關係。於是便有了word embedding,將詞彙對映到連續的,稠密的向量空間。doc2vec實現方法和word2vec類似,通過訓練,我們可以推測出一句話的固定維度的向量表達。
本文使用python gensim包,在Django框架基礎上簡單說明word2vec訓練和doc2vec訓練方法。
一.word2vec訓練
將目標語料庫進行分詞
def train_data_build(): file = r'F:\train_data.txt' names = file_name('F:\\data') for name in names: f = open(name, errors='ignore') st = f.read() with open(file, 'a+') as f: seg_list = jieba.cut(st, cut_all=False) f.write(" ".join(seg_list)) f.write('\n') f.close()
對分詞結果進行訓練
def train_data():
from gensim.models import word2vec
sentences = word2vec.Text8Corpus('F:\\train_data.txt')
model = word2vec.Word2Vec(sentences, size=50)
model.save('word2vec_model')
分詞是一個開銷比較大的工作,最開始訓練的目標是搜狗公佈的新聞語料庫,但用我的手提電腦跑了兩個小時才切完詞,切出了一個十幾個G的文字檔案,再進行訓練電腦立馬卡死。
二.doc2vec訓練
假設已經蒐集好了需要訓練的句子,儲存在model Sentence中
TaggededDocument = gensim.models.doc2vec.TaggedDocument def train_sentence(): sens = Sentence.objects.all() dic = {} for sen in sens: dic[sen.name]=sen.sen_id keys=dic.keys() x_train = [] for key in keys: document = TaggededDocument(key, tags=dic[key]) x_train.append(document) model_dm = Doc2Vec(x_train, min_count=1, window=3, vector_size=100, sample=1e-3, negative=5, workers=4) model_dm.train(x_train, total_examples=model_dm.corpus_count, epochs=70) model_dm.save('model/model_doc2vec')