[NLP]使用LDA模型計算文件相似度
阿新 • • 發佈:2018-12-22
定義
wiki關於lda的定義:
隱含狄利克雷分佈簡稱LDA(Latent Dirichlet allocation),是一種主題模型,它可以將文件集中每篇文件的主題按照概率分佈的形式給出。同時它是一種無監督學習演算法,在訓練時不需要手工標註的訓練集,需要的僅僅是文件集以及指定主題的數量k即可。此外LDA的另一個優點則是,對於每一個主題均可找出一些詞語來描述它。
LDA首先由Blei, David M.、吳恩達和Jordan, Michael I於2003年提出,目前在文字挖掘領域包括文字主題識別、文字分類以及文字相似度計算方面都有應用。
lda也是一種典型的詞袋模型,它假設每一篇文件都是一組詞的集合,並且詞與詞之間沒有順序和先後關係。一篇文章可以包含多個主題,文件中的每一個詞都是由其中的一個主題生成。
實現
import codecs
from gensim.models import LdaModel
from gensim.corpora import Dictionary
from gensim import corpora, models
import numpy as np
import jieba
import tutorials.data_util as du
def get_dict():
train = []
fp = codecs.open('../xx.txt', 'r', encoding='utf8')#文字檔案,輸入需要提取主題的文件
stopwords = ['的' , '嗎', '我', '會', '使用', '跟', '了', '有', '什麼', '這個', '下', '或者', '能', '要', '怎麼', '呢', '吧', '都']#取出停用詞
for line in fp:
line = list(jieba.cut(line))
train.append([w for w in line if w not in stopwords])
dictionary = Dictionary(train)
return dictionary,train
def train_model():
dictionary=get_dict()[0 ]
train=get_dict()[1]
corpus = [ dictionary.doc2bow(text) for text in train ]
lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=7)
#模型的儲存/ 載入
lda.save('test_lda.model')
#計算兩個文件的相似度
def lda_sim(s1,s2):
lda = models.ldamodel.LdaModel.load('test_lda.model')
test_doc = list(jieba.cut(s1)) # 新文件進行分詞
dictionary=get_dict()[0]
doc_bow = dictionary.doc2bow(test_doc) # 文件轉換成bow
doc_lda = lda[doc_bow] # 得到新文件的主題分佈
# 輸出新文件的主題分佈
# print(doc_lda)
list_doc1 = [i[1] for i in doc_lda]
# print('list_doc1',list_doc1)
test_doc2 = list(jieba.cut(s2)) # 新文件進行分詞
doc_bow2 = dictionary.doc2bow(test_doc2) # 文件轉換成bow
doc_lda2 = lda[doc_bow2] # 得到新文件的主題分佈
# 輸出新文件的主題分佈
# print(doc_lda)
list_doc2 = [i[1] for i in doc_lda2]
# print('list_doc2',list_doc2)
try:
sim = np.dot(list_doc1, list_doc2) / (np.linalg.norm(list_doc1) * np.linalg.norm(list_doc2))
except ValueError:
sim=0
#得到文件之間的相似度,越大表示越相近
return sim