LDA (一) 文本关键词提取

一、算法原理:使用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])


 

 

你可能感兴趣的:(数据挖掘,NLP)