赞
踩
一、算法原理:使用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] = templist
3、判断训练集每个文档所属主题和其候选关键词 得到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])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。