1. 程式人生 > >[NLP]使用LDA模型計算文件相似度

[NLP]使用LDA模型計算文件相似度

定義

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