精华内容
下载资源
问答
  • 使用LDA模型,从一篇文章中实现关键词提取
  • lda_lda_LDA关键词_源码

    2021-10-03 11:59:37
    利用lda算法对多个pdf文档实现关键词提取
  • LDA (三) 关键词提取2.0

    千次阅读 2019-01-03 15:17:31
    前言:对于第一个版本 的基于LDA的文本关键词提取 实现了给定文本,提取其关键的功能。后来有需求变动,需要给出所提取的关键词的重要程度排名。便有一个问题:如何判断文本自身的词语的重要性几何,其打分的依据是...

    前言:对于第一个版本 的基于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改进相关

     

    展开全文
  • NLP关键词提取方法总结及实现

    万次阅读 多人点赞 2019-07-23 21:09:41
    四、LDA主题模型关键词提取算法及实现 五、Word2Vec词聚类的关键词提取算法及实现 六、信息增益关键词提取算法及实现 七、互信息关键词提取算法及实现 八、卡方检验关键词提取算法及实现 九、基于树模型的...

    目录

    一、关键词提取概述

    二、TF-IDF关键词提取算法及实现

    三、TextRank关键词提取算法实现

    四、LDA主题模型关键词提取算法及实现

    五、Word2Vec词聚类的关键词提取算法及实现

    六、信息增益关键词提取算法及实现

    七、互信息关键词提取算法及实现

    八、卡方检验关键词提取算法及实现

    九、基于树模型的关键词提取算法及实现

    十、总结


    一、关键词提取概述

    关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作。

    从算法的角度来看,关键词提取算法主要有两类:无监督关键词提取方法有监督关键词提取方法

    1、无监督关键词提取方法

    不需要人工标注的语料,利用某些方法发现文本中比较重要的词作为关键词,进行关键词提取。该方法是先抽取出候选词,然后对各个候选词进行打分,然后输出topK个分值最高的候选词作为关键词。根据打分的策略不同,有不同的算法,例如TF-IDF,TextRank,LDA等算法。

    无监督关键词提取方法主要有三类:基于统计特征的关键词提取(TF,TF-IDF);基于词图模型的关键词提取(PageRank,TextRank);基于主题模型的关键词提取(LDA)

    • 基于统计特征的关键词提取算法的思想是利用文档中词语的统计信息抽取文档的关键词;
    • 基于词图模型的关键词提取首先要构建文档的语言网络图,然后对语言进行网络图分析,在这个图上寻找具有重要作用的词或者短语,这些短语就是文档的关键词;
    • 基于主题关键词提取算法主要利用的是主题模型中关于主题分布的性质进行关键词提取;

    2、有监督关键词提取方法

    将关键词抽取过程视为二分类问题,先提取出候选词,然后对于每个候选词划定标签,要么是关键词,要么不是关键词,然后训练关键词抽取分类器。当新来一篇文档时,提取出所有的候选词,然后利用训练好的关键词提取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词。

    3、无监督方法和有监督方法优的缺点

    无监督方法不需要人工标注训练集合的过程,因此更加快捷,但由于无法有效综合利用多种信息 对候选关键词排序,所以效果无法与有监督方法媲美;而有监督方法可以通过训练学习调节多种信息对于判断关键词的影响程度,因此效果更优,有监督的文本关键词提取算法需要高昂的人工成本,因此现有的文本关键词提取主要采用适用性较强的无监督关键词提取。

    4、关键词提取常用工具包

    二、TF-IDF关键词提取算法及实现

    TF-IDF算法的详细介绍及实现方法总结参看博客:TF-IDF算法介绍及实现

    三、TextRank关键词提取算法实现

    TextRank算法的详细介绍及实现方法总结参看博客:TextRank算法介绍及实现

    四、LDA主题模型关键词提取算法及实现

    1、LDA(Latent Dirichlet Allocation)文档主题生成模型

    主题模型是一种统计模型用于发现文档集合中出现的抽象“主题”。主题建模是一种常用的文本挖掘工具,用于在文本体中发现隐藏的语义结构。

    LDA也称三层贝叶斯概率模型,包含词、主题和文档三层结构;利用文档中单词的共现关系来对单词按主题聚类,得到“文档-主题”和“主题-单词”2个概率分布。

    通俗理解LDA主题模型原理

    2、基于LDA主题模型的关键词提取算法实现

    from gensim import corpora, models
    import jieba.posseg as jp
    import jieba
    
    
    # 简单文本处理
    def get_text(text):
        flags = ('n', 'nr', 'ns', 'nt', 'eng', 'v', 'd')  # 词性
        stopwords = ('的', '就', '是', '用', '还', '在', '上', '作为')  # 停用词
        words_list = []
        for text in texts:
            words = [w.word for w in jp.cut(text) if w.flag in flags and w.word not in stopwords]
            words_list.append(words)
        return words_list
    
    
    # 生成LDA模型
    def LDA_model(words_list):
        # 构造词典
        # Dictionary()方法遍历所有的文本,为每个不重复的单词分配一个单独的整数ID,同时收集该单词出现次数以及相关的统计信息
        dictionary = corpora.Dictionary(words_list)
        print(dictionary)
        print('打印查看每个单词的id:')
        print(dictionary.token2id)  # 打印查看每个单词的id
    
        # 将dictionary转化为一个词袋
        # doc2bow()方法将dictionary转化为一个词袋。得到的结果corpus是一个向量的列表,向量的个数就是文档数。
        # 在每个文档向量中都包含一系列元组,元组的形式是(单词 ID,词频)
        corpus = [dictionary.doc2bow(words) for words in words_list]
        print('输出每个文档的向量:')
        print(corpus)  # 输出每个文档的向量
    
        # LDA主题模型
        # num_topics -- 必须,要生成的主题个数。
        # id2word    -- 必须,LdaModel类要求我们之前的dictionary把id都映射成为字符串。
        # passes     -- 可选,模型遍历语料库的次数。遍历的次数越多,模型越精确。但是对于非常大的语料库,遍历太多次会花费很长的时间。
        lda_model = models.ldamodel.LdaModel(corpus=corpus, num_topics=2, id2word=dictionary, passes=10)
    
        return lda_model
    
    
    if __name__ == "__main__":
        texts = ['作为千元机中为数不多拥有真全面屏的手机,OPPO K3一经推出,就簇拥不少粉丝', \
                 '很多人在冲着这块屏幕购买了OPPO K3之后,发现原来K3的过人之处不止是在屏幕上', \
                 'OPPO K3的消费者对这部手机总体还是十分满意的', \
                 '吉利博越PRO在7月3日全新吉客智能生态系统GKUI19发布会上正式亮相', \
                 '今年上海车展,长安CS75 PLUS首次亮相', \
                 '普通版车型采用的是双边共双出式排气布局;运动版本车型采用双边共四出的排气布局']
        # 获取分词后的文本列表
        words_list = get_text(texts)
        print('分词后的文本:')
        print(words_list)
    
        # 获取训练后的LDA模型
        lda_model = LDA_model(words_list)
    
        # 可以用 print_topic 和 print_topics 方法来查看主题
        # 打印所有主题,每个主题显示5个词
        topic_words = lda_model.print_topics(num_topics=2, num_words=5)
        print('打印所有主题,每个主题显示5个词:')
        print(topic_words)
    
        # 输出该主题的的词及其词的权重
        words_list = lda_model.show_topic(0, 5)
        print('输出该主题的的词及其词的权重:')
        print(words_list)
    

    运行结果:

    五、Word2Vec词聚类的关键词提取算法及实现

    1、Word2Vec词向量表示

    利用浅层神经网络模型自动学习词语在语料库中的出现情况,把词语嵌入到一个高维的空间中,通常在100-500维,在高维空间中词语被表示为词向量的形式。

    特征词向量的抽取是基于已经训练好的词向量模型。

    2、K-means聚类算法

    聚类算法旨在数据中发现数据对象之间的关系,将数据进行分组,使得组内的相似性尽可能的大,组间的相似性尽可能的小。

    算法思想是:首先随机选择K个点作为初始质心,K为用户指定的所期望的簇的个数,通过计算每个点到各个质心的距离,将每个点指派到最近的质心形成K个簇,然后根据指派到簇的点重新计算每个簇的质心,重复指派和更新质心的操作,直到簇不发生变化或达到最大的迭代次数则停止。

    3、基于Word2Vec词聚类关键词提取方法的实现过程

    主要思路是对于用词向量表示的词语,通过K-Means算法对文章中的词进行聚类,选择聚类中心作为文本的一个主要关键词,计算其他词与聚类中心的距离即相似度,选择topK个距离聚类中心最近的词作为关键词,而这个词间相似度可用Word2Vec生成的向量计算得到。

    具体步骤如下:

    • 对语料进行Word2Vec模型训练,得到词向量文件;
    • 对文本进行预处理获得N个候选关键词;
    • 遍历候选关键词,从词向量文件中提取候选关键词的词向量表示;
    • 对候选关键词进行K-Means聚类,得到各个类别的聚类中心(需要人为给定聚类的个数);
    • 计算各类别下,组内词语与聚类中心的距离(欧几里得距离或曼哈顿距离),按聚类大小进行降序排序;
    • 对候选关键词计算结果得到排名前TopK个词语作为文本关键词。
       

    :第三方工具包Scikit-learn提供了K-Means聚类算法的相关函数,本文用到了sklearn.cluster.KMeans()函数执行K-Means算法,sklearn.decomposition.PCA()函数用于数据降维以便绘制图形。

    六、信息增益关键词提取算法及实现

    信息增益算法的详细介绍及实现方法总结参看博客:信息增益算法介绍及实现

    七、互信息关键词提取算法及实现

    1、互信息(Mutual Information,MI)

    在概率论和信息论中,两个随机变量的互信息或转移信息(transinformation)是变量间相互依赖性的量度。不同于相关系数,互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分布的乘积 p(X)p(Y) 的相似程度。互信息是度量两个事件集合之间的相关性(mutual dependence)。

    互信息被广泛用于度量一些语言现象的相关性。在信息论中,互信息常被用来衡量两个词的相关度,也用来计算词与类别之间的相关性。

    2、互信息计算公式

     3、互信息算法实现

    from sklearn import metrics
    import numpy as np
    
    # 训练集和训练标签
    x_train = [[1, 2, 3, 4, 5],
               [5, 4, 3, 2, 1],
               [3, 3, 3, 3, 3],
               [1, 1, 1, 1, 1]]
    y_train = [0, 1, 0, 1]
    # 测试集和测试标签
    x_test = [[2, 2, 2, 2, 2], [2, 1, 1, 2, 1]]
    
    x_train = np.array(x_train)  # 转为array
    
    # 存储每个特征与标签相关性得分
    features_score_list = []
    for i in range(len(x_train[0])):
        # 计算每个特征与标签的互信息
        feature_info = metrics.mutual_info_score(y_train, x_train[:, i])
        features_score_list.append(feature_info)
    
    print(features_score_list)
    

    运行结果: 

    4、信息论中的互信息和决策树中的信息增益的关系 

    两者表达意思是一样的,都是表示得知特征 X 的信息而使得类 Y 的信息的不确定性减少的程度。

    注:

    • 标准化互信息(Normalized Mutual Information,NMI)可以用来衡量两种聚类结果的相似度。
    • 标准化互信息Sklearn实现:metrics.normalized_mutual_info_score(y_train, x_train[:, i])。
    • 点互信息(Pointwise Mutual Information,PMI)这个指标来衡量两个事物之间的相关性(比如两个词)。

    八、卡方检验关键词提取算法及实现

    1、卡方检验

    卡方是数理统计中用于检验两个变量独立性的方法,是一种确定两个分类变量之间是否存在相关性的统计方法,经典的卡方检验是检验定性自变量对定性因变量的相关性。

    2、基本思路

    • 原假设:两个变量是独立的
    • 计算实际观察值和理论值之间的偏离程度
    • 如果偏差足够小,小于设定阈值,就接受原假设;否则就否定原假设,认为两变量是相关的。

    3、计算公式

    其中,A为实际值,T为理论值。卡方检验可用于文本分类问题中的特征选择,此时不需要设定阈值,只关心找到最为相关的topK个特征。基本思想:比较理论频数和实际频数的吻合程度或者拟合优度问题。

    4、基于sklearn的卡方检验实现

    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    
    # 训练集和训练标签
    x_train = [[1, 2, 3, 4, 5],
               [5, 4, 3, 2, 1],
               [3, 3, 3, 3, 3],
               [1, 1, 1, 1, 1]]
    y_train = [0, 1, 0, 1]
    # 测试集和测试标签
    x_test = [[2, 2, 2, 2, 2], [2, 1, 1, 2, 1]]
    y_test = [1, 1]
    
    # 卡方检验选择特征
    chi2_model = SelectKBest(chi2, k=3)  # 选择k个最佳特征
    # 该函数选择训练集里的k个特征,并将训练集转化所选特征
    x_train_chi2 = chi2_model.fit_transform(x_train, y_train)
    # 将测试集转化为所选特征
    x_test_chi2 = chi2_model.transform(x_test)
    
    print('各个特征的得分:', chi2_model.scores_)
    print('各个特征的p值:', chi2_model.pvalues_)  # p值越小,置信度越高,得分越高
    print('所选特征的索引:', chi2_model.get_support(True))
    print('特征提取转换后的训练集和测试集...')
    print('x_train_chi2:', x_train_chi2)
    print('x_test_chi2:', x_test_chi2)

    运行结果:

    九、基于树模型的关键词提取算法及实现

    1、树模型

    主要包括决策树和随机森林,基于树的预测模型(sklearn.tree 模块和 sklearn.ensemble 模块)能够用来计算特征的重要程度,因此能用来去除不相关的特征(结合 sklearn.feature_selection.SelectFromModel)

    sklearn.ensemble模块包含了两种基于随机决策树的平均算法:RandomForest算法Extra-Trees算法。这两种算法都采用了很流行的树设计思想:perturb-and-combine思想。这种方法会在分类器的构建时,通过引入随机化,创建一组各不一样的分类器。这种ensemble方法的预测会给出各个分类器预测的平均。

    • RandomForests 在随机森林(RF)中,该ensemble方法中的每棵树都基于一个通过可放回抽样(boostrap)得到的训练集构建。另外,在构建树的过程中,当split一个节点时,split的选择不再是对所有features的最佳选择。相反的,在features的子集中随机进行split反倒是最好的split方式。sklearn的随机森林(RF)实现通过对各分类结果预测求平均得到,而非让每个分类器进行投票(vote)。
    • Ext-Trees 在Ext-Trees中(详见ExtraTreesClassifier和 ExtraTreesRegressor),该方法中,随机性在划分时会更进一步进行计算。在随机森林中,会使用侯选feature的一个随机子集,而非查找最好的阈值,对于每个候选feature来说,阈值是抽取的,选择这种随机生成阈值的方式作为划分原则。

    2、树模型的关键词提取算法实现

    (1)部分代码实现1

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.ensemble import ExtraTreesClassifier
    from sklearn.feature_selection import SelectFromModel
    
    # 导入SelectFromModel结合ExtraTreesClassifier计算特征重要性,并按重要性阈值选择特征。
    # 基于树模型进行模型选择
    clf_model = ExtraTreesClassifier(n_estimators=250, random_state=0)
    clf_model.fit(x_train, y_train)
    # 获取每个词的特征权重,数值越高特征越重要
    importances = clf_model.feature_importances_
    # 选择特征重要性为1.5倍均值的特征
    model = SelectFromModel(clf_model, threshold='1.5*mean', prefit=True)
    x_train_new = model.transform(x_train)  # 返回训练集所选特征
    x_test_new = model.transform(x_test)  # 返回测试集所选特征
    

    (2)部分代码实现2

    # 训练集和训练标签
    x_train, y_train
    # 候选特征词列表
    words_list
    
    # 基于树模型进行模型选择
    forest = RandomForestClassifier(n_estimators=250, random_state=0)
    forest.fit(x_train, y_train)
    importances = forest.feature_importances_  # 获取每个词的特征权重
    
    # 将词和词的权重存入字典
    feature_words_dic = {}
    for i in range(len(words_list)):
        feature_words_dic[words_list[i]] = importances[i]
    
    # 对字典按权重由大到小进行排序
    words_info_dic_sort = sorted(words_info_dic.items(), key=lambda x: x[1], reverse=True)
    
    # 将关键词和词的权重分别存入列表
    keywords_list = []  # 关键词列表
    features_list = []  # 关键权重列表
    for word in words_info_dic_sort:
        keywords_list.append(word[0])
        features_list.append(word[1])
    
    # 选取前一千个关键词和权重写入文本文件
    keywords = keywords_list[:1000]
    features = features_list[:1000]
    
    # 将含有关键字的文本写入文件
    with open('data/keywords_features.txt', 'a', encoding="utf-8") as f:
        for i in range(len(keywords)):
            f.write(keywords[i] + '\t' + features[i] + '\n')

    十、总结

    本文总结了本人在实验过程中所用到的常用关键词抽取方法,实验数据是基于公司的内部数据,但此篇总结只是方法上的讲解和实现,没有针对某一具体数据集做相应的结果分析。从实验中可以很明显看出有监督关键词抽取方法通常会显著好于无监督方法,但是有监督方法依赖一定规模的标注数据。

     

     

    参考:

    1、NLP关键词抽取常见算法

    2、gensim models.ldamodel

    3、卡方检验原理及应用

    4、特征选择 (feature_selection)

    5、随机森林算法总结及调参

    6、句子相似度计算

    展开全文
  • TF/idf进行关键词提取 """ 关键词提取 基于 TF-IDF 算法的关键词抽取 import jieba.analyse jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) sentence 为待提取的文本 topK 为返回...

    TF/idf进行关键词提取

    """
    关键词提取
    基于 TF-IDF 算法的关键词抽取
    import jieba.analyse
    jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    sentence 为待提取的文本
    topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    withWeight 为是否一并返回关键词权重值,默认值为 False
    allowPOS 仅包括指定词性的词,默认值为空,即不筛选
    """
    import jieba.analyse as analyse
    import pandas as pd
    df = pd.read_csv("./data/technology_news.csv", encoding='utf-8')
    df = df.dropna()
    lines=df.content.values.tolist()
    content = "".join(lines)
    print ("  ".join(analyse.extract_tags(content, topK=30, withWeight=False, allowPOS=())))
    

    """
    基于 TextRank 算法的关键词抽取
    jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
    jieba.analyse.TextRank() 新建自定义 TextRank 实例
    算法论文: TextRank: Bringing Order into Texts
    
    基本思想:
    
    将待抽取关键词的文本进行分词
    以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
    计算图中节点的PageRank,注意是无向带权图
    """
    import jieba.analyse as analyse
    import pandas as pd
    df = pd.read_csv("./data/military_news.csv", encoding='utf-8')
    df = df.dropna()
    lines=df.content.values.tolist()
    content = "".join(lines)
    
    print ("  ".join(analyse.textrank(content, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))))
    print("---------------------我是分割线----------------") 
    print("  ".join(analyse.textrank(content, topK=20, withWeight=False, allowPOS=('ns', 'n')))) 

    LDA主题模型

     

    """
    
    LDA主题模型
    咱们来用LDA主题模型建模,看看这些新闻主要在说哪些topic。
    首先我们要把文本内容处理成固定的格式,一个包含句子的list,list中每个元素是分词后的词list。类似下面这个样子。
    [[第,一,条,新闻,在,这里],[第,二,条,新闻,在,这里],[这,是,在,做, 什么],...]
    """
    from gensim import corpora, models, similarities
    import gensim
    """
    载入停用词
    """
    stopwords=pd.read_csv("./data/stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'], encoding='utf-8')
    stopwords=stopwords['stopword'].values
    
    import jieba
    import pandas as pd
    df = pd.read_csv("./data/technology_news.csv", encoding='utf-8')
    df = df.dropna()
    lines=df.content.values.tolist()
    
    sentences=[]
    for line in lines:
        try:
            segs=jieba.lcut(line)
            #print(segs)
            segs = filter(lambda x:len(x)>1, segs)
            segs = filter(lambda x:x not in stopwords, segs)
            #print(segs)
            sentences.append(list(segs))
        except Exception:
            print(line) 
            continue
            
    """
    词袋模型
    """
    dictionary = corpora.Dictionary(sentences)
    corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
    """
    LDA建模
    """
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
    """
    我们查一下第3号分类,其中最常出现的单词是:
    """
    print (lda.print_topic(3, topn=5))
    """
    我们把所有的主题打印出来看看
    """
    for topic in lda.print_topics(num_topics=20, num_words=8):
        print (topic[1])
    
    """
    保存模型
    """
    from sklearn.externals import joblib
    joblib.dump(lda,"./主题分类1.pkl")

    详细理论知识细节

    https://blog.csdn.net/v_july_v/article/details/41209515

    展开全文
  • LDA (一) 文本关键词提取

    千次阅读 2018-11-30 15:39:38
    一、算法原理:使用gensim自带的LDAmodel。使用方法原理是:候选的关键词与抽取的主题计算相似度并进行排序,得到最终的关键词...如果文档分词后得到的词语在候选关键词中,那么将其作为关键词提取出来。(候选关键词...

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


     

     

    展开全文
  • # 四个参数分别是:训练好的idf字典,默认idf值,处理后的待提取文本,关键词数量 def __init__(self, idf_dic, default_idf, word_list, keyword_num): self.word_list = word_list self.idf_dic, self.default...
  • NLP基础知识之Excel读写、关键词提取、主题模型LDA一、用openpyxl 方法写Excel二、关键词提取三、LDA四、模式匹配 本文参照bilibili上课程《用CNN实现文本分类》。 一、用openpyxl 方法写Excel 首先导入包:from ...
  • 关键词提取算法

    2012-06-13 10:43:21
    关键词提取算法
  • 语料是一个关于汽车的短文本,下面通过 Gensim 库完成基于 LDA 的关键字提取。整个过程的步骤为:文件加载 -> jieba 分词 -> 去停用词 -> 构建词袋模型 -> LDA 模型训练 -> 结果可视化: # -*- coding...
  • 关键词提取算法概述

    千次阅读 2019-01-22 09:23:10
    关键词提取概述 概念 关键词是指能反映文本主题或者主要内容的词语。关键词提取是NLP领域的一个重要的子任务。在信息检索中,准确的关键词提取可以大幅提升效率;在对话系统中,机器可以通过关键词来理解用户意图;...
  • 关键词提取

    2018-06-07 18:12:13
    关键词提取的方法:1TF-IDF2Topic-model:使用主题模型提取关键词的关键思想是认为文章是由主题组成的,而文章中的词是以一定概率从主题中选取的,即文章与词之间存在一个主题集合。不同的主题下,词出现的概率分布...
  • 首先推荐一下在NLP方面比较好的一个博客,本文也是参考这位博主写的。链接点这里。本文主要对TF-IDF代码重新改写了一下,几个函数顺序调用比原文较好理解一点,对于刚入NLP的我们来...1、关键词提取技术概述:  相...
  • python 实现关键词提取

    万次阅读 2019-02-10 13:42:12
    关键词提取的几个方法:1.textrank 2.tf-idf 3.LDA,其中textrank和tf-idf在jieba中都有封装好的函数,调用起来十分简单便捷。常用的自然语言处理的库还有nltk,gensim,sklearn中也有封装好的函数可以进行SVD分解和...
  • 关键词提取算法学习

    2018-06-27 09:52:34
    下面链接是几种关键词提取算法textrank,TFIDF,LDA,PLSA,TRP关键词提取算法
  • content_S[1000][:10]#打印第1000条看一下分词结果,显示前10个 ['阿里巴巴', '集团', '昨日', '宣布', ',', '将', '在', '集团', '管理', '层面'] TF-IDF :用结巴的库进行关键词提取 import jieba.analyse index ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,204
精华内容 881
关键字:

lda关键词提取