[NLP]使⽤LDA模型计算⽂档相似度
版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。 blog.csdn/android_ruben/article/details/75576961
定义
wiki关于lda的定义:
隐含狄利克雷分布简称LDA(Latent Dirichlet allocation),是⼀种主题模型,它可以将⽂档集中每篇⽂档的主题按照概率分布的形式给出。同时它是⼀种⽆监督学习算法,在训练时不需要⼿⼯标注的训练集,需要的仅仅是⽂档集以及指定主题的数量k即可。此外LDA的另⼀个优点则是,对于每⼀个主题均可出⼀些词语来描述它。
LDA⾸先由Blei, David M.、吴恩达和Jordan, Michael I于2003年提出,⽬前在⽂本挖掘领域包括⽂本主题识别、⽂本分类以及⽂本相似度计算⽅⾯都有应⽤。
lda也是⼀种典型的词袋模型,它假设每⼀篇⽂档都是⼀组词的集合,并且词与词之间没有顺序和先后关系。⼀篇⽂章可以包含多个主题,⽂档中的每⼀个词都是由其中的⼀个主题⽣成。
实现
import codecs
试用期总结>时光鸡的经典台词dels import LdaModel
pora 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])
12月份的节日>生物园
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('del')
#计算两个⽂档的相似度
def lda_sim(s1,s2):
lda = models.ldamodel.LdaModel.load('del')
度的组词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) / ((list_doc1) * (list_doc2))
except ValueError:
sim=0
#得到⽂档之间的相似度,越⼤表⽰越相近
return sim