一、算法原理:使用gensim自带的LDAmodel。使用方法原理是:候选的关键词与抽取的主题计算相似度并进行排序,得到最终的关键词。关键点,候选关键词和抽取的主题如何计算相似度?最简单的想法是:每个主题由N个单词*概率 的集合来代表。每个文本属于k个主题,把k个主题所包含的词赋予该文档,便得到每个文档的候选词关键词。如果文档分词后得到的词语在候选关键词中,那么将其作为关键词提取出来。(候选关键词,一般指文档分词之后得到的词,这里指文档所属主题所包含的词)
二、方法流程:1、语料预处理、2、基于语料生成LDA模型、3、将模型用于某个文本得到该文本的topic概率分布和关键词。
1、LDA模型生成
# 模型生成
train = []
corpus_path = "traindata/"
filelist = os.listdir(corpus_path) # 获取corpus_path下的所有文件
for file_path in filelist: # 遍历类别目录下文件
fullname = corpus_path + file_path # 拼出文件名全路径
content = readfile(fullname).strip() # 读取文件内容
temp = chinese_word_cut(content)
train.append(temp)
M = len(train) # 训练集大小
dictionary = corpora.Dictionary(train)
corpus = [dictionary.doc2bow(text) for text in train]
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=6,iterations=200)2、得到每个主题下面所包含的词语。得到topic_word_dict
num_topics = 6
num_show_term = 20 # 每个主题保留20个词语
topic_word_dict = {} # key:主题i value: 主题i包含的词语。
for topic_id in range(num_topics):
templist = []
term_distribute_all = lda.get_topic_terms(topicid=topic_id)
a1 = lda.print_topics()
term_distribute = term_distribute_all[:num_show_term]
term_distribute = np.array(term_distribute)
term_id = term_distribute[:, 0].astype(np.int)
for t in term_id:
templist.append(dictionary.id2token[t])
topic_word_dict[topic_id] = templist3、判断训练集每个文档所属主题和其候选关键词 得到doc_topic_dict 和doc_word_dict
doc_topic_dict = {} # key: 第i篇文章 value: 第i篇文章的主题分布
doc_word_dict = {} # key: 第i篇文章 value: 第i篇文章的主题所包含的词语
for i in range(M):
templist2 = [] #临时变量,存储topici包含的词语
test_doc=train[i]#查看训练集中第i个样本
doc_bow = dictionary.doc2bow(test_doc) #文档转换成bow
num_show_topic = 2 # 每个文档取其前2个主题
doc_topics = lda.get_document_topics(doc_bow) # 某文档的主题分布
#print(doc_topics)
doc_topic_dict[i] = doc_topics[:num_show_topic]
for topic in doc_topics:
temp_word = topic_word_dict[topic[0]]
templist2 += temp_word
doc_word_dict[i] = templist2
4 打印每个文档的关键词
#打印 每个文档的关键词
for i in range(M):
keyword = []
print('文档%s的关键词:' %filelist[i])
for word in train[i]:
if word in doc_word_dict[i]:
keyword.append(word)
print(set(keyword))
print('文档%s的主题:' %filelist[i])
print(doc_topic_dict[i])
版权声明:本文为qq_34333481原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。