精华内容
下载资源
问答
  • gensim库_LDA主题模型困惑度Perplexity计算
    千次阅读
    2020-07-19 15:23:54

    LDA主题模型困惑度Perplexity计算

    perplexity是一种信息理论的测量方法,b的perplexity值定义为基于b的熵的能量(b可以是一个概率分布,或者概率模型),通常用于概率模型的比较。
    该部分内容可参考Perplexity(困惑度)python下进行lda主题挖掘(三)——计算困惑度perplexitypython gensim里的log_perplexity得出的结果是困惑度吗?
    可搜索到的资料都通过编程实现了困惑度的计算,不过gensim库其实自带了perplexity的计算模块,稍作修改即可返回模型困惑度。
    对于困惑度的理解还十分有限,有待日后更新。

    导入gensim库

    from gensim.models import LdaModel
    

    首先,导入gensim库的LdaModel模块。
    然后,查看gensim\models\ldamodel.py源码。搜索perplexity。

        def log_perplexity(self, chunk, total_docs=None):
            """Calculate and return per-word likelihood bound, using a chunk of documents as evaluation corpus.
    
            Also output the calculated statistics, including the perplexity=2^(-bound), to log at INFO level.
    
            Parameters
            ----------
            chunk : {list of list of (int, float), scipy.sparse.csc}
                The corpus chunk on which the inference step will be performed.
            total_docs : int, optional
                Number of docs used for evaluation of the perplexity.
    
            Returns
            -------
            numpy.ndarray
                The variational bound score calculated for each word.
    
            """
            if total_docs is None:
                total_docs = len(chunk)
            corpus_words = sum(cnt for document in chunk for _, cnt in document)
            subsample_ratio = 1.0 * total_docs / len(chunk)
            perwordbound = self.bound(chunk, subsample_ratio=subsample_ratio) / (subsample_ratio * corpus_words)
            logger.info(
                "%.3f per-word bound, %.1f perplexity estimate based on a held-out corpus of %i documents with %i words",
                perwordbound, np.exp2(-perwordbound), len(chunk), corpus_words
            )
            return perwordbound
    

    可以看到在模型输出中,其实有困惑度的计算过程,只是没有输出而已。
    修改源代码,最后return的部分

            #添加perplexity变量,输出模糊度
            perplexity=np.exp2(-perwordbound)
            return perwordbound,perplexity
    

    即可,返回困惑度计算结果。

    计算困惑度

    lda=LdaModel(common_corpus,num_topics=num_topic,id2word=dic,alpha='auto',chunksize=len(texts_all),iterations=20000)
    _,perplexity=lda.log_perplexity(common_corpus)   
    

    返回值perplexity即为LDA模型的困惑度。

    更多相关内容
  • 关于gensim库中lda主题模型困惑度和一致性python图像绘制 第三方库使用: matplotlib 前期准备 函数参数解释 num_topics: 主题数量 corpus: 处理过的文档语料 dictionary:对应词典 import gensim from gensim ...

    关于gensim库中lda主题模型困惑度和一致性python图像绘制

    第三方库使用: matplotlib

    前期准备

    函数参数解释
    num_topics: 主题数量
    corpus: 处理过的文档语料
    texts:二维列表(源代码存储的是中文分词)
    dictionary:对应词典

    import gensim
    from gensim import corpora, models
    
    """
    dictionary = corpora.Dictionary(texts)
    corpus = [dictionary.doc2bow(text) for text in texts]
    """
    
    def lda_model_values(num_topics, corpus, dictionary):
        x = [] # x轴
        perplexity_values = [] # 困惑度
        coherence_values = []   # 一致性
        model_list = [] # 存储对应主题数量下的lda模型,便于生成可视化网页
    
        for topic in range(num_topics):
            print("主题数量:", topic+1)
            lda_model = models.LdaModel(corpus=corpus, num_topics=topic+1, id2word =dictionary, chunksize = 2000, passes=20, iterations = 400)
            model_list.append(lda_model)
            x.append(topic+1)
            perplexity_values.append(lda_model.log_perplexity(corpus))
    
            coherencemodel = models.CoherenceModel(model=lda_model, texts=texts, dictionary=dictionary, coherence='c_v')
            coherence_values.append(coherencemodel.get_coherence())
            print("该主题评价完成\n")
        return model_list, x, perplexity_values, coherence_values
        
    

    绘图

    import matplotlib.pyplot as plt
    import matplotlib
    from pylab import xticks,yticks,np
    
    
    # 调用准备函数
    model_list, x, perplexity_values, coherence_values = lda_model_values(num_topics, corpus, dictionary) 
    
    # 绘制困惑度和一致性折线图
    fig = plt.figure(figsize=(15,5))
    plt.rcParams['font.sans-serif']=['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False 
    
    
    ax1 = fig.add_subplot(1, 2, 1)
    plt.plot(x, perplexity_values, marker="o")
    plt.title("主题建模-困惑度")
    plt.xlabel('主题数目')
    plt.ylabel('困惑度大小')
    xticks(np.linspace(1, num_topics, num_topics, endpoint=True)) # 保证x轴刻度为1
    
    
    
    ax2 = fig.add_subplot(1, 2, 2)
    plt.plot(x, coherence_values, marker="o")
    plt.title("主题建模-一致性")
    plt.xlabel("主题数目")
    plt.ylabel("一致性大小")
    xticks(np.linspace(1, num_topics, num_topics, endpoint=True))
    
    
    plt.show()
    

    效果展示

    在这里插入图片描述

    根据困惑度和一致性进行主题数量的选择

    基本选择:困惑度越低越好,一致性越高越好

    关于代码的使用问题

    建议先会使用gensim库中关于lda的函数,包括corpus和dictionary的生成

    展开全文
  • LDA主题模型困惑度计算

    万次阅读 2018-09-26 19:13:12
    对于LDA模型,最常用的两个评价方法困惑度(Perplexity)、相似度(Corre)。  其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度困惑度越低,说明...

     对于LDA模型,最常用的两个评价方法困惑度(Perplexity)、相似度(Corre)。

        其中困惑度可以理解为对于一篇文章d,所训练出来的模型对文档d属于哪个主题有多不确定,这个不确定成都就是困惑度。困惑度越低,说明聚类的效果越好。

       计算公式     分母是测试集中所有单词之和,即测试集的总长度,不用排重。其中p(w)指的是测试集中每个单词出现的概率,计算公式如下。p(z|d)表示的是一个文档中每个主题出现的概率,就是程序中的.theta文件,p(w|z)表示的是词典中的每一个单词在某个主题下出现的概率,就是程序中的.phi文件。

    复制代码

     1 public void getRe(double[][] phi, double[][] theta){
     2         double count = 0;
     3         int i = 0;
     4         Iterator iterator = userWords.entrySet().iterator();
     5         while(iterator.hasNext()){
     6             Map.Entry entry = (Map.Entry) iterator.next();
     7             ArrayList<String> list = (ArrayList<String>) entry.getValue();
     8             double mul = 0;
     9             for(int j = 0; j < list.size(); j++){
    10                 double sum = 0;
    11                 String word = list.get(j);
    12                 int index = wordMap.get(word);
    13                 for (int k = 0; k < K; k++){
    14                     sum = sum + phi[k][index] * theta[i][k];
    15                 }
    16                 mul = mul + Math.log(sum);
    17             }
    18             count = count + mul;
    19             i++;
    20         }
    21         count = 0 - count;
    22         P = Math.exp(count / N);
    23         System.out.println("Perplexity:" + P);

    复制代码

    对于不同Topic所训练出来的模型,计算它的困惑度。最小困惑度所对应的Topic就是最优的主题数。

     

    转载自https://www.cnblogs.com/bydream/p/6844499.html

    展开全文
  • LDA常见的应用方向:信息提取和搜索(语义分析);文档分类/聚类、文章摘要、社区挖掘;基于内容的图像聚类、目标识别(以及其他计算机视觉应用);生物信息数据的应用;...LDA模型通过增加“主题”的方...

    LDA常见的应用方向:

    信息提取和搜索(语义分析);文档分类/聚类、文章摘要、社区挖掘;基于内容的图像聚类、目标识别(以及其他计算机视觉应用);生物信息数据的应用;

    对于朴素贝叶斯模型来说,可以胜任许多文本分类问题,但无法解决语料中一词多义和多词一义的问题--它更像是词法分析,而非语义分析。如果使用词向量作为文档的特征,一词多义和多词一义会造成计算文档间相似度的不准确性。LDA模型通过增加“主题”的方式,一定程度的解决上述问题:

    一个词可能被映射到多个主题中,即,一词多义。多个词可能被映射到某个主题的概率很高,即,多词一义。

    LDA涉及的主要问题

    1)共轭先验分布

    2)Dirichlet分布

    3)LDA模型

    Gibbs采样算法学习参数

    共轭先验分布

    由于x为给定样本,P(x)有时被称为“证据”,仅仅是归一化因子,如果不关心P(θ|x)的具体值,只考察θ取何值时后验概率P(θ|x)最大,则可将分母省去。

    在贝叶斯概率理论中,如果后验概率P(θ|x)和先验概率p(θ)满足同样的分布律,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。

    Dirichlet分布

    在学习Dirichlet分布之前先复习以下二项分布的最大似然估计:

    投硬币试验中,进行N次独立试验,n次朝上,N-n次朝下。假定朝上的概率为p,使用对数似然函数作为目标函数:

    上述过程的理论解释

    投掷一个非均匀硬币,可以使用参数为θ的伯努利模型,θ为硬币为正面的概率,那么结果x的分布形式为:

    两点分布/二项分布的共轭先验是Beta分布,它具有两个参数α和β,Beta分布形式为

    先验概率和后验概率的关系

    根据似然和先验:

    计算后验概率:

    后验概率是参数为(k+α,n-k+β)的Beta分布,即:伯努利分布/二项分布的共轭先验是Beta分布。

    参数α、β是决定参数θ的参数,即超参数。

    在后验概率的最终表达式中,参数α、β和k、n-k一起作为参数θ的指数——后验概率的参数为(k+α,n-k+β)。

    根据这个指数的实践意义:投币过程中,正面朝上的次数,α和β先验性的给出了在没有任何实验的前提下,硬币朝上的概率分配;因此,α和β可被称作“伪计数”。

    共轭先验的直接推广

    从2到K:二项分布→多项分布,Beta分布→Dirichlet分布

    Dirichlet分布

    复习—Beta分布中的B(α,β)的表示:

    Dirichlet分布:

    Dirichlet分布的期望

    根据Beta分布的期望公式:

    推广得到:

    Dirichlet分布分析

    α是参数向量,共K个,定义在x1,x2…xK-1维上:

    x1+x2+…+xK-1+xK=1

    x1,x2…xK-1>0

    定义在(K-1)维的单纯形上,其他区域的概率密度为0

    对称Dirichlet分布

    α=1时,退化为均匀分布

    α>1时,p1=p2=...=pk的概率增大

    α<1时,pi=1,p¬i=0的概率增大

    多项分布的共轭分布是Dirichlet分布

    调参经验传授:做LDA的时候,在条件允许的情况下,α值尽量不要设置太大,这样做的好处是充分考虑样本的因素,而不要过分考虑先验参数的影响。

    当然,如果先验给的大,就是更多考虑先验,而不是样本。这需要充分根据实际情况决定,如果说我们认为样本的情况是重要的,就不要加入太大的先验。

    LDA的解释

    1)共有m篇文章,一共涉及了K个主题;

    2)每篇文章(长度为Nm)都有各自的主题分布,主题分布是多项分布,该多项分布的参数服从Dirichlet分布,该Dirichlet分布的参数为α;

    3)每个主题都有各自的词分布,词分布为多项分布,该多项分布的参数服从Dirichlet分布,该Dirichlet分布的参数为β;

    4)对于某篇文章中的第n个词,首先从该文章的主题分布中采样一个主题,然后在这个主题对应的词分布中采样一个词。不断重复这个随机生成过程,直到m篇文章全部完成上述过程。

    详细解释:此段非常有利于理解LDA主题模型

    1)字典中共有V个term(不可重复),这些term出现在具体的文章中,就是word——在具体某文章中的word当然是有可能重复的。

    2)语料库中共有m篇文档d1,d2…dm;

    3)对于文档di,由Ni个word组成,可重复;

    4)语料库中共有K个主题T1,T2…Tk;

    5)α和β为先验分布的参数,一般事先给定:如取0.1的对称Dirichlet分布——表示在参数学习结束后,期望每个文档的主题不会十分集中。

    6)θ是每篇文档的主题分布

    对于第i篇文档di的主题分布是θi=(θi1, θi2…,θiK),是长度为K的向量;

    7)对于第i篇文档di,在主题分布θi下,可以确定一个具体的主题zij=k,k∈[1,K]

    8)φk表示第k个主题的词分布,k∈[1,K]

    对于第k个主题Tk的词分布φk=(φk1, φk2… φkv),是长度为v的向量

    9)由zij选择φzij,表示由词分布φzij确定term,即得到观测值wij。

    10)图中K为主题个数,M为文档总数,Nm是第m个文档的单词总数。β是每个Topic下词的多项分布的Dirichlet先验参数,α是每个文档下Topic的多项分布的Dirichlet先验参数。zmn是第m个文档中第n个词的主题,wmn是m个文档中的第n个词。两个隐含变量θ和φ分别表示第m个文档下的Topic分布和第k个Topic下词的分布,前者是k维(k为Topic总数)向量,后者是v维向量(v为词典中term总数)

    参数的学习

    给定一个文档集合,wmn是可以观察到的已知变量,α和β是根据经验给定的先验参数,其他的变量zmn、θ、φ都是未知的隐含变量,需要根据观察到的变量来学习估计的。根据LDA的图模型,可以写出所有变量的联合分布:

    似然概率:

    一个词wmn初始化为一个词t的概率是:

    每个文档中出现主题k的概率乘以主题k下出现词t的概率,然后枚举所有主题求和得到。整个文档集合的似然函数为:

    Gibbs Sampling吉布斯采样

    1)Gibbs Sampling算法的运行方式是每次选取概率向量的一个维度,给定其他维度的变量值采样当前维度的值。不断迭代直到收敛输出待估计的参数。

    2)初始时随机给文本中的每个词分配主题z(0),然后统计每个主题z下出现词t的数量以及每个文档m下出现主题z的数量,每一轮计算p(zi|z-i,d,w),即排除当前词的主题分布:

    根据其他所有词的主题分布估计当前词分配各个主题的概率。

    3)当得到当前词属于所有主题z的概率分布后,根据这个概率分布为该词采样一个新的主题。

    4)用同样的方法更新下一个词的主题,直到发现每个文档的主题分布θi和每个主题的词分布φj收敛,算法停止,输出待估计的参数θ和φ,同时每个单词的主题zmn也可同时得出。

    5)实际应用中会设置最大迭代次数。每一次计算p(zi|z-i,d,w)的公式称为Gibbs updating rule。

    联合分布:

    第一项因子是给定主题采样词的过程

    后面的因子计算,nz(t)表示词t被观察到分配给主题z的次数, nm(k) 表示主题k分配给文档m的次数。

    Gibbs updating rule:

    词分布和主题分布:

    超参数的确定

    1)交叉验证

    2)α表达了不同文档间主题是否鲜明,β度量了有多少近义词能够属于同一个类别。

    3)主题数目K,词项数目为W,可以使用:

    α=50/K

    β=200/W

    注:不一定普遍适用

    一种迭代求超参数的方法:

    Digamma函数:

    迭代公式:(T. Minka)

    主题个数的确定

    1)相似度最小

    2)选取初始的主题个数K,训练LDA模型,计算各主题之间的相似度

    3)增加或减少K的值,重新训练LDA模型,再次计算topic之间的相似度

    4)选择相似度最小的模型所对应的K作为主题个数。

    概率分布的困惑度/复杂度Perplexity

    某离散概率分布p的困惑度为:

    样本集x1,x2…xn的估计模型q的困惑度为:

    a为任意整数。

    交叉熵为:

    困惑度Perplexity与主题模型

    使用训练数据得到无监督模型,在测试数据集中计算所有token似然值几何平均数的倒数。

    测试数据集中词典大小的期望

    其中,LDA中词的似然概率为:

    PageRank

    一个网页i的重要度可以使用指向网页i的其他网页j的重要度加权得到。

    权值不妨取网页j包含的链接数目。

    参数的意义为:

    1)网页i的中重要性D(Pi)

    2)阻尼系数d,如设置为常系数0.85

    3)指向网页i的网页集合ln(Pi)

    4)网页j指向的网页集合Out(Pj)

    TextRank

    将PageRank中的“网页”换成“词”,结论仍成立。

    选择合适的窗口大小,认为窗口内的词相互指向。

    句子Si和Sj的相似度:

    将PageRank中“网页”换成“句子”,结论仍然基本成立,只需考虑将“链接”加权:

    LDA总结

    1)由于在词和文档之间加入的主题的概念,可以较好的解决一词多义和多词一义的问题。

    2)在实践中发现,LDA用于短文档往往效果不明显——这是可以解释的:因为一个词被分配给某个主题的次数和一个主题包括的词数目尚未敛。往往需要通过其他方案“连接”成长文档。

    3)LDA可以和其他算法相结合。首先使用LDA将长度为Ni的文档降维到K维(主题的数目),同时给出每个主题的概率(主题分布),从而可以使用if-idf继续分析或者直接作为文档的特征进入聚类或者标签传播算法——用于社区发现等问题。

    展开全文
  • LDA 主题模型效果度量

    2020-12-29 04:08:03
    度量方法:在测试集或训练集上计算困惑度在具体应用中看效果,如分类这里主要说说如何计算困惑度。计算方法为:计算每篇文档的概率p(d),除以所有文档词的总数(不排重),乘以-1,求指数难点在于计算每篇文档的概率 ...
  • 如果不想用MATLAB你也可以用Cpython lda主题模型,需要使用什么包?python lda 主题模型 需要使用什么包 数据结构是程序构成的重要部分,链表、树、图这些在用C 编程时需要仔细表达的问题在Pyth...
  • 文章目录训练LDA模型困惑度计算得到一段文本的主题全部代码及案例(可直接运行) 首先使用gensim库: pip install gensim 训练LDA模型 import gensim # pip install gensim from gensim import corpora def train_...
  • LDA主题模型已经在多个研究领域得到应用,且都有着不俗表现。 LDA作为一种无监督机器学习技术,利用词袋方法识别隐藏在大规模文档集或语料库中的主题信息。LDA模型可挖掘出文档集或语料库中的潜在主题信息,并采用...
  • 使用R语言中的jiebaR包,对中文文本进行分词,求词频,做词云图并进行LDA主题建模
  • Perplexity(困惑度)详解

    千次阅读 2020-12-19 13:53:34
    引子:今年上半年,我报名参加了...不过由于最近要写一篇主题模型的文章,我重读了下LDA以及其他一些主题模型的经典文献,发现自己之前理解上存在一些偏差,于是就想写一篇博客,把整个思路重新理顺一下。(1)Perpl...
  • python下进行lda主题挖掘(三)——计算困惑度perplexity

    万次阅读 多人点赞 2018-03-07 17:07:19
    到2018年3月7日为止,本系列三篇文章已写完,可能后续有新的内容的话...python下进行lda主题挖掘(三)——计算困惑度perplexity 本篇是我的LDA主题挖掘系列的第三篇,专门来介绍如何对训练好的LDA模型进行评价。 ...
  • 这是我读书时的一次内部分享,现拿来与大家分享
  • 折肘法+困惑度确定LDA主题模型的主题数

    千次阅读 热门讨论 2020-10-24 10:30:46
    LDA主题模型主题数的确定 折肘法+困惑度确定lda模型的主题个数 背景 lda topic model需要确定从每篇文章中提取多少个关键词,最简单的就是折肘法+困惑度的方法。 补充:还是懒得说背景!以后想起来再补充!还是电脑...
  • LDA模型困惑度计算出现的问题

    千次阅读 2019-02-26 10:53:10
    LDA程序使用的是JGibbLDA 读theta文件,构造theta二维矩阵。 读phi文件,构造phi二维矩阵。 读tassign文件,得到每篇文本的词数Nd,继而得到测试集的总词数Nsum;并根据tassign文件构造每篇文本所有词组成的词表。 ...
  • LDA计算 perplexity(困惑度)确定主题个数(代码)

    万次阅读 多人点赞 2019-10-23 15:31:36
    为了计算LDA困惑度,费劲千辛万苦,终于有所收获,以此记录。 本篇文章主要介绍perplexity的计算方式,并未涉及过多的困惑度原理,想了解更多原理部分,请移步perplexity介绍 本文主要是对Perplexity per word...
  • LDA主题模型

    2021-02-06 23:38:48
    (一)LDA主题模型问题问题1:一篇文章,生成乐观主题、悲观主题的概率假设独立同分布(服从伯努利分布),生成n个主题。设生成乐观主题的概率为θ。1.伯努利分布Bernoulli distribution概率密度函数2.二项式分布...
  • LDA主题模型简介及Python实现

    万次阅读 多人点赞 2022-01-09 09:22:39
    一、LDA主题模型简介 LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。 LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-...
  • LDA主题模型的原理及使用教程

    千次阅读 热门讨论 2021-08-08 17:43:44
    LDA主题模型是Blei等人于2003年提出的一种文档主题生成模型,包括文档、主题和词项3个层级结构。LDA常被用于识别语料中潜在的主题信息。 LDA认为第m篇文档的生成方式如下: 1.对每个主题k∈[1,K],生成“主题-词项”...
  • LDA主题挖掘时,通常采用主题困惑度进行最佳主题数的选择。在利用sklearn.decomposition.LatentDirichletAllocation进行主题困惑度计算时,其提供了一个perplexity函数,但是实际计算结果是随着主题数的增加,函数值...
  • LDA主题模型评价指标汇总

    千次阅读 多人点赞 2021-02-04 11:49:42
    主题模型评价指标-主题距离引入与效果展示注意事项个人经验 引入与效果展示 在训练好LDA模型后,一个很自然的举动就是尝试去衡量模型的好坏。 比如去看看自己聚出来的模型直接有哪些不同。 本文介绍的模型评价可视化...
  • 简单讲述LDA主题模型
  • 文本聚类常用的聚类方法有K-means,hclust等(可以看),而今天则操作一个比较复杂的LDA文本主题模型。 1.载入包 library(Rwordseg)#分词处理工具 library(tm)#文本整理工具,创建矩阵 library(tmcn) library(lda)#LDA...
  • Gensim LDA主题模型实验

    2021-01-12 02:22:00
    本文利用gensim进行LDA主题模型实验,第一部分是基于前文的wiki语料,第二部分是基于Sogou新闻语料。1. 基于wiki语料的LDA实验上一文得到了wiki纯文本已分词语料 wiki.zh.seg.utf.txt,去停止词后可进行LDA实验。...
  • 文章目录前言正文评估方式LDA模型LDA之...前段时间看了LDA主题模型的理论知识,想着还是需要具体实践来感受下。然后想着搜一下看还有没有别的主题模型,看能不能都跑一下demo对比下效果,结果看到了一篇汇总类的知乎: ...
  • 包括Python分词,去停用词,使用gensim包进行LDA主题分析,并输出每条矩阵属于每个主题的概率的代码,以及停用词表
  • LDA困惑度

    千次阅读 2021-02-22 15:46:16
    用perplexity去看主题个数,代码供参考 import re import math import json import random import requests import pandas as pd from gensim import corpora, models import jieba.posseg as jp, jieba from ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 455
精华内容 182
关键字:

LDA主题模型困惑度