LDA (三) 关键词提取2.0

前言:对于第一个版本 的基于LDA的文本关键词提取  实现了给定文本,提取其关键的功能。后来有需求变动,需要给出所提取的关键词的重要程度排名。便有一个问题:如何判断文本自身的词语的重要性几何,其打分的依据是什么。这也是所有关键词提取方法中最重要的一步。

思路:1.  LDA模型训练得到 topic_word 。由此可以知道每个topic 由哪些单词所代表,以及每个单词在这个topic的重要性得分。

         2.   对于测试集文本,经过LDA模型之后,得到该文本对应的topic(通常一个文本会有多个topic,舍弃概率小的,保留大概率的topic)。由1得到的每个topic包含的单词,将其赋值给测试集文本,作为候选关键词。而对于每个候选关键词,其得分 score= 每个topic的概率*每个单词属于该topic的概率。

实现算法:在LDA模型完成之后的后续代码。

a = lda.print_topics(num_topics=6)
topic_word_dict = {}
for k in range(num_topics):
    b = lda.print_topic(k)
    b = b.split(' + ')
    word_score_list = []
    for i in b:
        temp1 = i.split('*')
        #print(temp1)
        temp1[1] = eval(temp1[1])
        word_score_list.append(temp1)
    topic_word_dict[k] = word_score_list
#print(topic_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)  # 某文档的主题分布
    doc_topic_dict[i] = doc_topics[:num_show_topic]
    for topic in doc_topic_dict[i]:
        temp_word = topic_word_dict[topic[0]]
        for k in range(len(temp_word)):
            temp_word[i][0] = float(temp_word[i][0]) * float(topic[1])
        #print(temp_word)
        templist2 += temp_word
    # 找出templist2所有关键词
    a = set()
    for word in templist2:
        a.add(word[1])
    b = len(templist2)
    c = {}
    for word in a:
        c[word] = 0
        for m in range(b):
            if templist2[m][1] == word :
                c[word] += float(templist2[m][0])
    doc_word_dict[i] = c
#print(doc_word_dict)

for i in range(M):
    keyword = {}
    print('文档%s的关键词:' %filelist[i])
    for word in train[i]:
        if word in doc_word_dict[i].keys():
            keyword[word] = doc_word_dict[i][word]
    keyword = sorted(keyword.items(), key=lambda x: x[1], reverse=True)
    print(keyword)

问题:如何遍历一个列表,如何合并其元素里相同的项。

由于列表的每个元素又是一个列表,这个子列表包含两个子元素。子元素有一项是单词,故先用一个集合保存单词,用一个字典保存结果。再遍历整个列表,判断每个元素的子元素的单词 ==word, 将其概率值赋值给字典。

LDA改进相关

 

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonLDA(Python Latent Dirichlet Allocation)是一种基于概率模型的文本主题建模方法,可以用来对文本数据进行主题分析和关键词提取。下面是一个简单的PythonLDA关键词提取的示例代码: ```python import pandas as pd import numpy as np import gensim from gensim import corpora, models from pprint import pprint # 读取数据集 data = pd.read_csv('data.csv', error_bad_lines=False) data_text = data[['text']] data_text['index'] = data_text.index documents = data_text # 分词和去除停用词 stoplist = set('for a of the and to in'.split()) texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents] # 构建词典 dictionary = corpora.Dictionary(texts) # 将文档转换为词袋表示 corpus = [dictionary.doc2bow(text) for text in texts] # 训练LDA模型 lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, random_state=100, update_every=1, chunksize=100, passes=10, alpha='auto', per_word_topics=True) # 输出主题关键词 pprint(lda_model.print_topics()) # 提取每个文档的主题 doc_lda = lda_model[corpus] # 输出每个文档的主题 for i in range(len(doc_lda)): print("Document", i+1, ":", doc_lda[i]) ``` 在这个代码示例中,我们首先读取一个文本数据集,然后进行分词和去除停用词操作。接着,我们使用Gensim库构建词典,并将文档转换为词袋表示。然后,我们训练一个LDA模型,并输出每个主题的关键词。最后,我们提取每个文档的主题,并输出它们的结果。 请注意,这只是一个简单的示例,如果你要使用PythonLDA进行关键词提取,你需要根据你的数据集和需求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值