Doc2vec段落向量的訓(xùn)練方法欢顷,與訓(xùn)練詞向量類似四瘫,段落向量的訓(xùn)練分為訓(xùn)練數(shù)據(jù)預(yù)處理和段落向量訓(xùn)練兩個(gè)步驟西饵。
- 訓(xùn)練數(shù)據(jù)預(yù)處理:對(duì)段落進(jìn)行分詞處理(中文分詞)蜈膨;
- 段落向量訓(xùn)練:
TaggedDocument()
這里對(duì)于文檔一般有兩種策略:
- 直接對(duì)doc整體進(jìn)行ID標(biāo)記悼沿,一個(gè)sentence中包含崗位描述的所有單詞等舔;
- 以
;
和糟趾。
來進(jìn)行句子劃分蓉坎,一個(gè)sentence中僅包含的崗位描述中的一句的單詞楼入,檢索時(shí)以單個(gè)句子來進(jìn)行檢索陕靠;
這里以第一種方式為例來介紹:
首先是去停用詞處理以及分詞杈曲,這里的分詞文件可以自己在網(wǎng)上找一下,有很多
# 創(chuàng)建停用詞list
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r').readlines()]
return stopwords
# 對(duì)句子進(jìn)行分詞
def seg_sentence(sentence, stopwords):
sentence_seged = jieba.cut(sentence.strip())
outstr = ''
for word in sentence_seged:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
return outstr
參考地址:PYTHON3.6對(duì)中文文本分詞非驮、去停用詞以及詞頻統(tǒng)計(jì)
分詞完以后交汤,數(shù)據(jù)形式變?yōu)椋?/p>
構(gòu)建doc2vec
模型進(jìn)行訓(xùn)練
from gensim.models import Doc2Vec
# 根據(jù)TaggedDocumnet生成訓(xùn)練語(yǔ)料
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(jd_df['doc_word'])]
model = Doc2Vec(documents,dm = 1, alpha=0.1, size= 20, min_alpha=0.025)
model.train(documents, total_examples=model.corpus_count, epochs=20)
model.save('model/d2vmodel')
應(yīng)用doc2vec
模型
# 模型加載
model_dm = Doc2Vec.load("model/d2vmodel20210422")
# 模型預(yù)測(cè)
test_text = ['獨(dú)立','工程','預(yù)算','編制']
inferred_vector_dm = model_dm.infer_vector(test_text)
sims = model_dm.docvecs.most_similar([inferred_vector_dm], topn=10)
向量效果驗(yàn)證
print(test_text)
for raw_index, sim in sims:
sentence = documents[raw_index]
print(sentence, sim, len(sentence[0]))
其實(shí)doc2vec的原理比較好理解,相當(dāng)于將doc id或者說是sentence id當(dāng)做一個(gè)單詞來和該doc或者sentence中單詞一起訓(xùn)練來學(xué)習(xí)它們的極大似然劫笙,以此來學(xué)習(xí)到該sentence id對(duì)應(yīng)的sentence中包含的word的關(guān)系芙扎。
可以參考下面兩張w2v和d2v的結(jié)構(gòu)圖來理解;
參考地址:
[1] 基于DOC2VEC的段落向量訓(xùn)練及文本相似度計(jì)算
[2] Doc2vec原理解析及代碼實(shí)踐