【NLP】【六】gensim之doc2vec
阿新 • • 發佈:2018-11-25
【一】總述
doc2vec是指將句子、段落或者文章使用向量來表示,這樣可以方便的計算句子、文章、段落的相似度。
【二】使用方法介紹
1. 預料準備
def read_corpus(fname, tokens_only=False): with open(fname, encoding="utf-8") as f: for i, line in enumerate(f): if tokens_only: yield gensim.utils.simple_preprocess(line) else: # For training data, add tags # 利用gensim進行doc2vec時,語料庫是一個TaggedDocument,其包括原始語料(句子、段落、篇章) # 和對應的id(如句子id,段落id,篇章id)即語料標識 yield gensim.models.doc2vec.TaggedDocument(gensim.utils.simple_preprocess(line), [i])
2. 模型訓練
方法一:
def train_doc2vec2(): train_file = "E:/nlp_data/in_the_name_of_people/in_the_name_of_people.txt" train_corpus = list(read_corpus(train_file)) model = gensim.models.doc2vec.Doc2Vec(documents=train_corpus,vector_size=50, min_count=2, epochs=10) model.save("doc2vec2.model")
方法二:
def train_doc2vec(): train_file = "E:/nlp_data/in_the_name_of_people/in_the_name_of_people.txt" train_corpus = list(read_corpus(train_file)) model = gensim.models.doc2vec.Doc2Vec(vector_size=50, min_count=2, epochs=10) model.build_vocab(train_corpus) model.train(train_corpus,total_examples=model.corpus_count,epochs = model.epochs) model.save("doc2vec.model")
3. 模型使用
3.1 推測句子、段落或者文章的向量表示
model = doc2vec.Doc2Vec.load("doc2vec.model")
# 基於已有模型,來推測新文件或者句子或者段落的向量
print(model.infer_vector(["李達康是市委書記"]))
3.2 求解句子或者段落或者文章相似的內容
model = doc2vec.Doc2Vec.load("doc2vec2.model")
inferred_vector = model.infer_vector(["沙瑞金是省委書記"])
# 求解句子或者段落或者文章的相似性
sims = model.docvecs.most_similar([inferred_vector], topn=3)
train_file = "E:/nlp_data/in_the_name_of_people/in_the_name_of_people.txt"
train_corpus = list(read_corpus(train_file))
for docid, sim in sims:
print(docid)
print(sim)
print(train_corpus[docid])
結果如下:
1295
0.4263337254524231
TaggedDocument(['這一來', '陳清泉就撞到槍口上了', '他想保也保不住', '其實他還是想保的', '這位法院副院長人不錯', '他沒必要得罪', '然而', '李達康要得罪', '他有啥辦法', '該查就得查了', '他不查', '李達康既可以換個人來查', '也可以查一查他', '政治鬥爭就是這麼殘酷無情', '它不以你個人的感情好惡為轉移', '於是', '他代表紀委宣佈了違紀事實', '最後做結論說', '有的被群眾舉報', '有的在網上炒得沸反盈天', '必須嚴肅處理', '情況就是這樣'], [1295])
1692
0.4215260446071625
TaggedDocument(['孫連城', '地站了起來', '大聲說', '李達康', '我辭職'], [1692])
281
0.41098830103874207
TaggedDocument(['估計有人通風報信了'], [281])
【三】總結
使用gensim的doc2vec進行句子、段落、文章的向量表示時,不需要進行分詞。