精华内容
下载资源
问答
  • 2021-12-11 13:50:32

    主题模型概念

    主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构进行聚类的统计模型。
    
    主题模型主要被用于自然语言处理中的语义分析和文本挖掘问题,例如按主题对文本进行收集、分类和降维。
    
    LDA是两个常用模型的简称:Linear Discriminant Analysis 和 Latent Dirichlet Allocation
    
    隐含狄利克雷分布(Latent Dirichlet Allocation, LDA)是常见的主题模型。它可以将文档集中每篇文档的主题按照概率分布的形式给出。
    

    在主题模型中,主题(topic)是以文本中所有字符为支撑集的概率分布,表示该字符在该主题中出现的频繁程度,即与该主题关联性高的字符有更大概率出现

    在文本拥有多个主题时,每个主题的概率分布都包括所有字符,但一个字符在不同主题的概率分布中的取值是不同的,一个主题模型试图用数学框架来体现文档的这种特点。

    主题模型自动分析每个文档,统计文档内的词语,根据统计的信息来断定当前文档含有哪些主题,以及每个主题所占的比例各为多少。

    举例而言,在“狗”主题中,与该主题有关的字符,例如“狗”、“骨头”等词会频繁出现;在“猫”主题中,“猫”、“鱼”等词会频繁出现。若主题模型在分析一篇文章后得到10%的“猫”主题和“90%”的狗主题,那意味着字符“狗”和“骨头”的出现频率大约是字符“猫”和“鱼”的9倍。

    LDA模型

    LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。

    LDA是常见的主题模型之一,是一类无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它。

    正如Beta分布是二项式分布共轭先验概率分布,狄利克雷分布作为多项式分布的共轭先验概率分布。
    因此正如LDA贝叶斯网络结构中所描述的,在LDA模型中一篇文档生成的方式如下:
    在这里插入图片描述
    在这里插入图片描述

    词袋模型

    LDA 采用词袋模型。所谓词袋模型,是将一篇文档,我们仅考虑一个词汇是否出现,而不考虑其出现的顺序。在词袋模型中,“我喜欢你”和“你喜欢我”是等价的。与词袋模型相反的一个模型是n-gram,n-gram考虑了词汇出现的先后顺序。

    二项分布

    在n次独立重复的伯努利试验中,设每次试验中事件A发生的概率为p。用X表示n重伯努利试验中事件A发生的次数,则X的可能取值为0,1,…,n,且对每一个k(0≤k≤n),事件{X=k}即为“n次试验中事件A恰好发生k次”,随机变量X的离散概率分布即为二项分布(Binomial Distribution).
    
    在概率论和统计学中,二项分布是n个独立的成功/失败试验中成功的次数的离散概率分布,其中每次试验的成功概率为p。这样的单次成功/失败试验又称为伯努利试验。实际上,当n=1时,二项分布就是伯努利分布。
    

    二项分布是N重伯努利分布,即为X~B(n, p).
    概率密度公式为:
    在这里插入图片描述

    多项分布

    多项式分布(Multinomial Distribution)是二项式分布的推广。
    
    二项分布的典型例子是扔硬币,硬币正面朝上概率为p, 重复扔n次硬币,k次为正面的概率即为一个二项分布概率。把二项分布公式推广至多种状态,就得到了多项分布。
    

    多项分布,是二项分布扩展到多维的情况. 多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能(1,2,3…,k).概率密度函数为:
    在这里插入图片描述
    其中随机向量x=(x1,x2,…,xn)满足xi ≥ 0(1≤ i ≤ k),且x1+x2+…+xk=K;

    随机向量x=(x1,x2,…,xk)服从多项分布,记作X~PK(K:p1.p2,…,pn)。

    举例:
    在一座大城市中,若男性在总人口中的比例为p,今从
    城市中随机抽N个人,用X表示其中男性的数目,则X~B(N,p),类似地,在一座城市中,若将人口按照年龄分成n组,这n组人在总人口中各占的比例分别为(p1,p2,…,),今从城市中随机抽N个人,用(X1,X2,…,Xn分别表示这N个人中每个年龄组的人数,则X=(X1,X2,…,Xn)服从多项分布。

    共轭先验分布

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

    在这里插入图片描述
    Beta分布是二项式分布的共轭先验分布,而狄利克雷(Dirichlet)分布是多项式分布的共轭分布。

    共轭的意思是,以Beta分布和二项式分布为例,数据符合二项分布的时候,参数的先验分布和后验分布都能保持Beta分布的形式,这种形式不变的好处是,我们能够在先验分布中赋予参数很明确的物理意义,这个物理意义可以延续到后续分布中进行解释,同时从先验变换到后验过程中从数据中补充的知识也容易有物理解释。

    学习链接

    某乎:一文详解LDA主题模型
    LDA主题模型及案例
    基于gensim的lda的小案例
    文本主题模型之LDA(一) LDA基础
    Java调用pyhton训练的机器学习模型

    更多相关内容
  • Python实现LDA主题模型以及模型可视化 - 采用jieba进行数据处理 - 采用gensim构建主题模型 - 采用pyLDAvis可视化主题模型
  • LDA主题模型的原理

    2018-12-17 14:07:38
    本文档详细阐述了LAD的基本原理和实用技巧,给出了Java版的LDA主题模型的用法,比较鲜明的介绍了共轭分布的基本原理,是比较全面的主题模型资料。
  • LDA主题模型.zip

    2019-01-05 21:56:20
    LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率...
  • 联合分布的半监督主题模型
  • LDA(Latent Dirichlet Allocation)是一个分层的概率主题模型,目前被广泛地应用于文本挖掘。这种模型既不考虑文档与文档之间的顺序关系,也不考虑同一篇文档中词与词之间的顺序关系,简化了问题的复杂性,同时也为模型的...
  • 资料说明:包括数据+代码+文档+代码讲解。 前言 2.项目背景 3.分析流程 4.数据预处理 5.评论分词 6.情感分析与建立模型 7.实际应用
  • 基于WMF_LDA主题模型的文本相似度计算
  • 什么是LDA? L主题模型是怎样运作的? LDA是如何看待文章和主题的? LDA如何知道哪几个词汇是同一个主题的呢? 使用吉布斯抽样使主题分布收敛 Gibbs sampling(吉布斯抽样) 狄里克雷分布
  • 为提升传统LDA 模型主题识别性能, 并给主题最优数目选择提供技术方案, 提出基于自适应聚类的K-wrLDA 模型。利用LDA 和Word2Vec 模型得出包含主题词概率信息及词义相关性的T-WV 矩 阵, 并将传统LDA 模型主题数目...
  • JAVA版LDA主题模型

    2018-11-23 13:55:17
    自然语言处理经典算法主题模型的JAVA版本,内含语料,可直接运行。
  • 主题模型LDA.ppt

    2020-02-21 22:49:04
    LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。
  • 主题模型

    万次阅读 多人点赞 2019-09-04 10:00:57
    文章目录主题模型定义主题模型历史简单案例引入知识储备:SVD——奇异值分解1、特征值2、SVD分解3、SVD与PCAPLSA——概率隐性语义分析1、SVD2、LSA3、PLSAPlSA原理应用1、 **PLSA:文档生成模型**2、**利用文档推断...

    主题模型

    定义

    主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构(latent semantic structure)进行聚类(clustering)的统计模型。

    主题模型主要被用于自然语言处理(Natural language processing)中的语义分析(semantic analysis)和文本挖掘(text mining)问题,例如按主题对文本进行收集、分类和降维;也被用于生物信息学(bioinfomatics)研究 [2] 。隐含狄利克雷分布Latent Dirichlet Allocation, LDA)是常见的主题模型。

    主题模型历史

    在这里插入图片描述

    简单案例引入

    通过建立判断是否为算法大牛:
    特征:

    • 穿条纹衬衫
    • 曾在BAT就职
    • 做过大型项目

    于主题模型对比:

    知识储备:SVD——奇异值分解

    1、特征值

    在这里插入图片描述在这里插入图片描述

    2、SVD分解

    在这里插入图片描述
    在这里插入图片描述

    通过案例手推SVD

    在这里插入图片描述
    步骤二:求解特征值
    在这里插入图片描述
    步骤三:求解特征向量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    python实现

    import numpy as np 
    A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]])
    print(np.linalg.svd(A))
    

    3、SVD与PCA

    PCA理解和含义

    • PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。
    • 我们用于机器学习的数据(主要是训练数据),方差大才有意义,不然输入的数据都是同一个点,那方差就为0了,这样输入的多个数据就等同于一个数据了。
    • 对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

    SVD推导PCA

    SVD其实是两个方向上的PCA
    PCA是对AA ^T的分解
    而SVD是:U的列是A
    AT的特征向量,V的列是AT*A的特征向量
    也可以通过SVD分解公式,利用求得得V求解 U(如上面手推求解答的案例)

    在这里插入图片描述

    PLSA——概率隐性语义分析

    Probabilistic Latent Semantic Analysis

    1、SVD

    参考博客:https://blog.csdn.net/chlele0105/article/details/12983833

    大矩阵A来描述这一百万篇文章和五十万词的关联性。这个矩阵中,每一行对应一篇文章,每一列对应一个词。
    在这里插入图片描述
    s
    三个矩阵有非常清楚的物理含义。第一个矩阵X是对词进行分类的结果,每一列表示一类主题,其中的每个非零元素表示一个主题与一篇文章的相关性,数值越大越相关。最后一个矩阵Y中的每一列表示100个语义类/词类,每个语义类/词类与500,000个词的相关性。中间的矩阵则表示文章主题和语义类/词类之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,就可以同时完成了近义词分类和文章的分类。(同时得到每类文章和每类词的相关性)。

    2、LSA

    与上面1不同的是行列转置:行代表单词在每篇文档中出现的次数,列代表一篇文档中出现词语的分布。
    在这里插入图片描述
    依据奇异值分解的性质1,矩阵A可以分解出n个特征值,然后依据性质2,我们选取其中较大的r个并排序,这样USVT就可以近似表示矩阵AA。对于矩阵U,每一列代表一个潜语义,这个潜语义的意义由m个单词按不同权重组合而成。因为U中每一列相互独立,所以r个潜语义构成了一个语义空间。S中每一个奇异值指示了该潜语义的重要度。VT中每一列仍然是一篇文档,但此时文档被映射了语义空间。V^T的大小远小于A。
    有了VT,我们就相当于有了矩阵AA的另外一种表示,之后我们就可以使用VT代替A进行之后的工作。

    流程

    (1)分析文档集合,建立词汇-文本矩阵A。
    (2)对词汇-文本矩阵进行奇异值分解。
    (3)对SVD分解后的矩阵进行降维
    (4)使用降维后的矩阵构建潜在语义空间

    LSA案例:
    在这里插入图片描述
    奇异值分解:
    [外链图片转存失败(img-tjcqwzM0-1567562386969)(en-resource://database/1817:1)]

    表示我们将文档映射到了一个3维语义空间中,其中第一维潜语义可以表示为
    在这里插入图片描述
    在这里插入图片描述
    在图上,每一个红色的点,都表示一个词,每一个蓝色的点,都表示一个title,这样我们可以对这些词和title进行聚类,比如stock和market可以放在一类,这也符合他们经常出现在一起的直觉,real和estate可以放在一类,dads,guide这种词就看起来有点孤立了,我们就不对他们进行合并了。对于title,T1和T3可以聚成一类,T2、T4、T5和T8可以聚成一类,所以T1和T3比较相似,T2、T4、T5和T8比较相似。按这样聚类出现的效果,可以提取文档集合中的近义词,这样当用户检索文档的时候,是用语义级别(近义词集合)去检索了,而不是之前的词的级别。这样一减少我们的检索、存储量,因为这样压缩的文档集合和PCA是异曲同工的,二可以提高我们的用户体验,用户输入一个词,我们可以在这个词的近义词的集合中去找,这是传统的索引无法做到的。

    LSA的优缺点

    • 优点

      1)低维空间表示可以刻画同义词,同义词会对应着相同或相似的主题。
      2)降维可去除部分噪声,是特征更鲁棒。
      3)充分利用冗余数据。
      4)无监督/完全自动化。
      5)与语言无关。

    • 缺点

      1)LSA可以处理向量空间模型无法解决的一义多词(synonymy)问题,但不能解决一词多义(polysemy)问题。因为LSA将每一个词映射为潜在语义空间中的一个点,也就是说一个词的多个意思在空间中对于的是同一个点,并没有被区分。
      2)SVD的优化目标基于L-2 norm 或者 Frobenius Norm 的,这相当于隐含了对数据的高斯分布假设。而 term 出现的次数是非负的,这明显不符合 Gaussian 假设,而更接近 Multi-nomial分布。(需要进一步研究为什么)
      3)特征向量的方向没有对应的物理解释。
      4)SVD的计算复杂度很高,而且当有新的文档来到时,若要更新模型需重新训练。
      5)没有刻画term出现次数的概率模型。
      6)对于count vectors 而言,欧式距离表达是不合适的(重建时会产生负数)。
      7)维数的选择是ad-hoc的。
      8)LSA具有词袋模型的缺点,即在一篇文章,或者一个句子中忽略词语的先后顺序。
      9)LSA的概率模型假设文档和词的分布是服从联合正态分布的,但从观测数据来看是服从泊松分布的。因此LSA算法的一个改进PLSA使用了多项分布,其效果要好于LSA。

    LSA——python实现

    gensim

    class gensim.models.lsimodel.LsiModel(corpus=None, num_topics=200, id2word=None, chunksize=20000, decay=1.0, distributed=False, onepass=True, power_iters=2, extra_samples=100, dtype=<type ‘numpy.float64’>)

    • 关键参数:

      corpus:文本语料
      num_topic:保留的语义维数
      id2word:ID到单词映射

    • 该对象包括如下方法:

      LsiModel.projection.u,获得左奇异向量;
      LsiModel.projection.s,获得奇异值;
      add_documents(),用新的语料更新模型;
      get_topics(),获取所有潜语义的向量表示;
      save(),保存模型到本地;
      load(),从本地加载模型;
      print_topic(topicno, topn=10),以string的形式输出第topicno个潜在语义的前topn个单词表示;
      print_topics(num_topics=20, num_words=10),以string形式输出前num_topics个潜在语义,每个语义用num_words个单词表示;
      show_topic(topicno, topn=10),获取定义第topicno个潜在语义的单词及其贡献;

    from gensim.test.utils import common_corpus,common_dictionary,get_tmpfile
    from gensim.models import LsiModel
    #构建模型
    print(common_corpus)
    '''
    #[[(0, 1), (1, 1), (2, 1)], [(0, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)], [(2, 1), (5, 1),......
    输出的为bag-of-word后的元组,(id,count)
    #语料为:common_texts = [
        ['human', 'interface', 'computer'],
        ['survey', 'user', 'computer', 'system', 'response', 'time'],
        ['eps', 'user', 'interface', 'system'],
        ['system', 'human', 'system', 'eps'],
        ['user', 'response', 'time'],
        ['trees'],
        ['graph', 'trees'],
        ['graph', 'minors', 'trees'],
        ['graph', 'minors', 'survey']
    ]
    '''
    
    model = LsiModel(common_corpus[:3],id2word=common_dictionary,num_topics=3)
    #将文档映射到语义空间
    vector = model[common_corpus[4]]
    #更新模型
    model.add_documents(common_corpus[4:])
    
    tmp_fname = get_tmpfile("lsi.model")
    model.save(tmp_fname)  # save model
    loaded_model = LsiModel.load(tmp_fname)  # load model
    
    umatri = loaded_model.projection.u
    print(umatri)
    print(umatri.shape)
    ss = umatri = loaded_model.projection.s
    print(ss)
    allt = loaded_model.get_topics()
    print(allt)
    t1 = loaded_model.print_topic(1,topn=12)
    print(t1)
    s1 = loaded_model.show_topic(1,topn=12)
    print(s1)
    

    [[(0, 1), (1, 1), (2, 1)], [(0, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)], [(2, 1), (5, 1), (7, 1), (8, 1)], [(1, 1), (5, 2), (8, 1)], [(3, 1), (6, 1), (7, 1)], [(9, 1)], [(9, 1), (10, 1)], [(9, 1), (10, 1), (11, 1)], [(4, 1), (10, 1), (11, 1)]]
    [[ 0.31308271 0.04475507 0.19130952]
    [ 0.06218628 0.02061632 0.33478657]
    [ 0.19775074 0.06519182 0.65889099]
    [ 0.39382732 0.05923975 -0.3405499 ]
    [ 0.29531217 -0.18289329 -0.18223293]
    [ 0.38646088 0.06871426 0.18062738]
    [ 0.39382732 0.05923975 -0.3405499 ]
    [ 0.52939178 0.10381526 -0.01644547]
    [ 0.13556445 0.04457551 0.32410443]
    [ 0.0363079 -0.53458542 0.11367757]
    [ 0.08395235 -0.65620128 0.0321324 ]
    [ 0.07242846 -0.46795875 -0.01133593]]

    (12, 3)
    [3.03555067 2.51654597 1.88136386]
    [[ 0.31308271 0.06218628 0.19775074 0.39382732 0.29531217 0.38646088
    0.39382732 0.52939178 0.13556445 0.0363079 0.08395235 0.07242846]
    [ 0.04475507 0.02061632 0.06519182 0.05923975 -0.18289329 0.06871426
    0.05923975 0.10381526 0.04457551 -0.53458542 -0.65620128 -0.46795875]
    [ 0.19130952 0.33478657 0.65889099 -0.3405499 -0.18223293 0.18062738
    -0.3405499 -0.01644547 0.32410443 0.11367757 0.0321324 -0.01133593]]

    -0.656*“graph” + -0.535*“trees” + -0.468*“minors” + -0.183*“survey” + 0.104*“user” + 0.069*“system” + 0.065*“interface” + 0.059*“time” + 0.059*“response” + 0.045*“computer” + 0.045*“eps” + 0.021*“human”

    [(‘graph’, -0.6562012837041503), (‘trees’, -0.5345854212634996), (‘minors’, -0.46795875376068946), (‘survey’, -0.18289328901588417), (‘user’, 0.10381525918751365), (‘system’, 0.06871425877803433), (‘interface’, 0.06519182403581872), (‘time’, 0.05923975195143014), (‘response’, 0.059239751951430136), (‘computer’, 0.044755068341685994), (‘eps’, 0.044575507236083514), (‘human’, 0.02061631679973524)]

    3、PLSA

    参考链接:https://www.cnblogs.com/Determined22/p/7237111.html

    https://blog.csdn.net/pipisorry/article/details/42560693

    pLSA 模型是有向图模型,将主题作为隐变量,构建了一个简单的贝叶斯网,采用EM算法估计模型参数。
    由于PLSA属于LSA到LDA的过滤,很少被使用~~ 可以减少研究!
    [外链图片转存失败(img-uA7SMdbB-1567562386972)(en-resource://database/1825:1)]

    PlSA原理

    公式推导

    [外链图片转存失败(img-zgYhWFjo-1567562386973)(en-resource://database/1827:1)]

    PLSA性质

    在这里插入图片描述
    在这里插入图片描述

    应用

    1、 PLSA:文档生成模型

    类似于掷色子的游戏,假定好主题个数后,建立“文档-主题”筛子,这个就是主题分布;之后建立“主题-词项”筛子,这个是词分布,两个分布都是多项式分布。

    选主题和选词都是两个随机的过程,先从主题分布{教育:0.5,经济:0.3,交通:0.2}中抽取出主题:教育,然后从该主题对应的词分布{大学:0.5,老师:0.3,课程:0.2}中抽取出词:大学。在这里插入图片描述
    在这里插入图片描述

    2、利用文档推断主题分布

    主题建模的目的:自动地发现文档集中的主题(分布)。

    文档d和单词w自然是可被观察到的,但主题z却是隐藏的。
    在这里插入图片描述

    这个图的意思是,文档中的每一个词都是先选定一个主题,再从中选择词得到;文档中的每个词并不一定对应同一个主题z(z放在了小方框的里面了)。
    d和w是可以通过样本得到的,所以对于任意一篇文档,其p(w|d)是已知的。
    在这里插入图片描述
    故得到**文档中每个词的生成概率**为:[外链图片转存失败(img-HLl0LSDj-1567562386982)(en-resource://database/1863:1)]

    【PLSA,样本随机,参数未知但是固定,所以PLSA属于频率派思想。区别于LDA:样本固定,参数未知且不固定,是个随机变量,服从一定的分布,所以LDA属于贝叶斯派思想。

    3、PLSA算法的EM推导

    期望最大化
    迭代直到收敛
    在这里插入图片描述EM算法的一般步骤:
    在这里插入图片描述

    LDA

    Latent Dirichlet allocation——隐含狄利克雷分布
    主要应用领域:文本主题识别、文本分类以及文本相似度计算。
    无监督学习,需要文档集和主题数
    可以用一些词语来表示主题

    模型示意图:

    在这里插入图片描述
    在这里插入图片描述

    与PLSA相比较,多了两个狄利克雷分布的先验知识。
    在这里插入图片描述

    案例:主题预测——基于gensim

    1、步骤:

    • 1、查看数据

    • 2、分词 :jieba 、df.apply(fun)

    • 3、预处理:去除标点、英文、停用词(需要停用词表)

    • 4、生成词典:

        from gensim import corpora        
        dictionary = corpora.Dictionary(tokenized_corpus)
      

      #Dictionary(615 unique tokens: [‘高血压’, ‘减轻’, ‘周身’, ‘咳嗽’, ‘流涕’]…)
      其中:tokenized_corpus为分词预处理后的语料列表

    • 5、生成稀疏矩阵

        doc_term_matrix = [dictionnary.doc2bow(doc) for doc in tolenised_corpus]
      

      #[[(0, 1)], [(1, 1), (2, 1), (3, 1), (4, 1)], [(5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (13, 2), (14, 2), (15, 1), (16, 1)],…

    • 6、训练模型

         lda  = LdaModel(doc_term_matrix,num_topics=20,id2word=dictionary,)
      
    • 7、保存模型

          lda.save(fname= "yiyaoLdaModel")
      
    • 8、预测给定文档的主题分布

      文本预处理,转化为“词+词频”的词矩阵
      分词
      去除停用词
      dictionary.doc2bow(list(text_list))#转化为词矩阵
      lda模型预测:lda[dictionary.doc2bow(list(text_list))]#主题+权重
      print(max(lda_vector, key=lambda item: item[1]))##权重最大的主题标号+权重

    2、 代码

    """
    @version: 3.7
    @author: jiayalu
    @file: ldaModel.py
    @time: 09/08/2019 09:36
    @description: 利用LDA模型获取主题,利用gensim训练
    步骤:
        1、查看数据
        2、分词 :jieba 、df.apply(fun)
        3、预处理:去除标点、英文、停用词、
        4、生成词典:from gensim import corpora        dictionary = corpora.Dictionary(tokenized_corpus)
        5、生成稀疏矩阵
        6、训练模型
        7、预测给定文档的主题分布
    
    
    """
    #查看数据,并选取有用数据、修改表头
    import pandas as pd
    df = pd.read_csv("E:\pythoncode\drugdescrib1.csv",encoding="utf-8")
    
    print(df.head())
    
    df.rename(columns = {"【药品名称】":"name","【适应症】":"illness"},inplace=True)
    df1 = df[["name","illness"]]
    print(df1.head())
    #分词
    import jieba
    def chinese_word_cut(mytext):
        return " ".join(jieba.cut(str(mytext)))
    print(df1.illness.head())
    df["content_citted"] = df1.illness.apply(chinese_word_cut)
    print(df.content_citted.head())
    
    #预处理:去除停用词、标点
    import re
    from nltk.corpus import stopwords
    
    def load_punctuations():
        pun_list = []
        with open("./pun_list.txt",encoding="utf-8")as fr:#表达符号数据
            for line in fr:
                line = line.strip()
                pun_list.append(line)
        return pun_list
    
    #英文停用词
    # english_stopwords = stopwords.words("english")
    chinese_stopwords = {}.fromkeys([line.strip() for line in open("chinese_stopwords.txt",encoding="utf-8")])#中文停用词文件
    pun_list = load_punctuations()
    
    def clean_text(text):
        text = text.strip()
        for pun in pun_list:
            text = text.replace(pun , " ")
        # new_text = ' '.join([w for w in text.split() if w not in english_stopwords and w not in chinese_stopwords and len(w)>1])
        new_text = ' '.join([w for w in text.split() if  w not in chinese_stopwords and len(w) > 1])
        return new_text
    
    
    import gensim
    from gensim.models.ldamodel import LdaModel
    from gensim import corpora
    from nltk import wordpunct_tokenize
    
    
    class Token_Corpus(object):
        def __init__(self, corpus):
            self.corpus = corpus
    
        def __iter__(self):
            for text in self.corpus:
                text = text.strip()
                text = clean_text(text)
                yield self.tokenize(text)
    
        def tokenize(self, text):
            token = wordpunct_tokenize(text)
            return token
    
    document = list(df["content_citted"])
    print(document)
    tokenized_corpus = Token_Corpus(document)
    print(tokenized_corpus)
    # for i in tokenized_corpus:
    #     print(i)
    
    #生成字典
    dictionary = corpora.Dictionary(tokenized_corpus)
    dictionary.filter_extremes(no_below=10,no_above=0.10)
    print(dictionary)#Dictionary(615 unique tokens: ['高血压', '减轻', '周身', '咳嗽', '流涕']...)
    # for i in dictionary:
    #     print(i)#数字0,1,2,3.....
    
    
    #生成稀疏矩阵
    class MyCorpus(object):
        def __init__(self, token_list, dictionary):
            self.token_list = token_list
            self.dictionary = dictionary
    
        def __iter__(self):
            for tokens in self.token_list:
                yield self.dictionary.doc2bow(tokens)
    
    doc_term_matrix = [dictionary.doc2bow(doc) for doc in tokenized_corpus]
    print(doc_term_matrix)
    # corpus = MyCorpus(tokenized_corpus,dictionary)
    # mm_corpus = gensim.corpora.MmCorpus('data_science.mm')
    # print(mm_corpus)
    
    #训练模型
    
    # lda  = LdaModel(doc_term_matrix,num_topics=20,id2word=dictionary,)
    # print(lda.print_topics(num_topics=5,num_words=5))
    # lda.save(fname= "yiyaoLdaModel")
    text = """
    1  肾动脉狭窄有报道称:ACE抑制剂可能使单侧或者双侧肾动脉狭窄患者的血肌酐或者血尿素氮(BUN)升高,但还没有在此类患者中长期使用本品的经验,但是可能会出现类似的结果。
     2  肾功能损害在那些肾功能依赖于肾素-血管紧张素-醛固酮系统活性的患者中(如严重的充分性心力衰竭患者)使用ACE抑制剂和AT1 受体拮抗剂,可能出现少尿和/或进行性氮质免疫,
     性肾功能衰竭和/或死亡(罕见),在此类患者中使用奥美沙坦酯治疗。3  胎儿/新生儿发病和死亡3.胎儿/新生儿发病和死亡对D类妊娠(第Ⅱ期和第Ⅲ期),直接作用于RAS的药物与胎儿
     和新生儿的损伤有关。一旦发现妊娠,应当尽快停止使用本品。如果必须用药,应当告知这些孕妇关于药物对他们胎儿的潜在危害,并进行系列超声波检查来评估羊膜内的情况。曾经在
     子宫内与血管紧张素Ⅱ受体拮抗剂接触过的婴儿应密切监测其血压过低,少尿和高血钾的情况,必要时做适当的治疗。 4  血容量不足或者低钠患者的低血压血容量不足或者低钠患者
     (例如那些使用大剂量利尿剂治疗的患者),在首次服用本品后可能会发生症状性低血压,必须在周密的医疗监护下使用该药治疗。如果发生低血压,患者应仰卧,必要时静脉注射生理盐水。
     一旦血压稳定,可继续用本品治疗。"""
    text1 ="""
    适用于敏感菌(不产β内酰胺酶菌株)所致的下列感染:1溶血链球菌、肺炎链球菌、葡萄球菌或流感嗜血杆菌所致中耳炎、鼻窦炎、咽炎、扁桃体炎等上呼吸道感染。
    2大肠埃希菌、奇异变形杆菌或粪肠球菌所致的泌尿生殖道感染。
    3溶血链球菌、葡萄球菌或大肠埃希菌所致的皮肤软组织感染。
    4溶血链球菌、肺炎链球菌、葡萄球菌或流感嗜血杆菌所致急性支气管炎、肺炎等下呼吸道感染。5急性单纯性淋病。7本品尚可用于治疗伤寒"""
    lda = LdaModel.load("yiyaoLdaModel")
    text_list = clean_text(chinese_word_cut(text)).split(" ")#分词后的列表,['适用', '敏感', '不产', '内酰胺酶' ..
    print(text_list)
    print("bow___________________________")
    print(dictionary.doc2bow(list(text_list)))#词矩阵:词+词频#[(29, 1), (30, 1), (31, 1), (32, 2), (33, 2), (34, 1), (35, 1), (36, 1), (37, 3), (38, 1), (39, 1), (40, 1), (41, 3), (114, 1), (137, 1), (145, 1)]
    # lda_vector = lda[dictionary.doc2bow(list(text_list))]
    lda_vector = lda[dictionary.doc2bow(list(text_list))]
    print(lda_vector)#主题标号+权重
    # Prints the most likely Topic. Performs Max based on the 2nd element in the tuple
    print(max(lda_vector, key=lambda item: item[1]))##权重最大的主题标号+权重
    print(lda.print_topic(max(lda_vector, key=lambda item: item[1])[0]))
    # print()
    
    

    3、部分结果

    在这里插入图片描述

    案例:主题预测——基于sklearn

    1、步骤

    1、加载数据

    读取——分词——写入
    数据格式为 “沙 瑞金 向 毛娅 打听 他们 家 在 京州 的 别墅 , 毛娅 笑 着 说 , 王 大路 事业有成 之后 , 要 给 欧阳 菁 和 她 公司 的 股权 , 她们 没有 要 , 王 大路 就 在 京州帝 豪园 买 了 三套 别墅 , 可是 李达 康和易 学习 都 不要 , 这些 房子 都 在 王 大路 的 名下 , 欧阳 菁 好像 去 住 过 , 毛娅 不想 去 , 她 觉得 房子 太大 很 浪费 , 自己 家住 得 就 很 踏实 。”

    2、加载停用词

    读取——写入list

    3、统计训练语料的词频

    from sklearn.fearure_extraction.text import CountVectorizer
    from sklearn.externals import joblib
    #训练语料,res1,res2,res3,...为读取的文本
    corpus = [res1,res2,res3...]
    #加载模型
    cntVector = CountVectorizer(stop_words=stopwrd_list)
    cntTf = cntVector.fit_transform(corpus)
    #保存便于测试时加载使用
    joblib.dump(cntVector, "cntVector")
    

    cntTf:(文档索引,词索引) 词频

    4、训练模型

    lda = LatentDirichletAllocation(n_components=2, max_iter=5,learning_method='online',learning_offset=50.,random_state=0)
    docres = lda.fit(cntTf)
    with open("lda.pickle", "wb") as fw:
        pickle.dump(docres,fw)print(docres)
    
    

    5、查看主题词

    def print_top_words(lda, features_names, n_top_words):
        for topic_idx, topic in enumerate(lda.components_):
            print("Topic#%d"%topic_idx)
            print(" ".join([features_names[i] for i in topic.argsort()[:-n_top_words-1:-1]]))
    n_top_words = 50
    tf_fearures_names = cntVector.get_feature_names()
    print_top_words(lda,tf_fearures_names,n_top_words)
    

    6、预测

    加载数据——加载词频统计——格式转换———加载模型——预测

    cut_content("nlp_test2.txt")
    res2 = get_corpus("cut_nlp_test2.txt")
    corpus2 = [res2]
    cntVectorload = joblib.load("cntVector")
    print(cntVectorload)
    cntTf2 = cntVectorload.transform(corpus2)
    print(cntTf2)
    cntTf2.toarray()
    with open("lda.pickle", "rb") as fr:
        lda = pickle.load(fr)
    topic_dist = lda.transform(cntTf2)
    print(topic_dist)
    

    在这里插入图片描述

    注意训练模型用fit,预测模型用transform

    2、代码

    """
    @version: 3.7
    @author: jiayalu
    @file: ldaOfsklearn.py
    @time: 13/08/2019 09:45
    @description: 利用sklearn 库中的lda训练模型
    步骤:
    1、加载数据,加载停用词典,都转化为列表形式
    2、利用CountVectorizer统计词频并保存,便于对新的预测文本进行转化
    3、lda模型训练
    4、预测
    """
    
    import jieba
    #加载数据,分词
    def cut_content(filename):
        with open(filename, "r", encoding="utf-8") as f:
            document = f.read()
            document_cut = jieba.cut(document)
            result = " ".join(document_cut)
            with open("cut_" + filename, "w", encoding="utf-8")as f2:
                f2.writelines(result)
        f.close()
        f2.close()
        # print(n)
    #加载停用词典
    stopwrd_dic = open("stopword.txt", "r", encoding="utf-8")
    stopwrd_content = stopwrd_dic.read()
    stopwrd_list = stopwrd_content.splitlines()
    stopwrd_dic.close()
    
    #读取预处理后的数据
    def get_corpus(filename):
        with open(filename, "r", encoding="utf-8")as f:
            resf = f.read()
        return resf
    
    cut_content("nlp_test1.txt")
    res1 = get_corpus("cut_nlp_test1.txt")
    
    #一般是基于词频的统计,很少用tfidf
    # from sklearn.feature_extraction.text import TfidfVectorizer
    # corpus = [res1]
    # vector = TfidfVectorizer(stop_words=stopwrd_list)
    # tfidf = vector.fit_transform(corpus)
    # print(vector.get_feature_names())
    # print(tfidf)
    # print(tfidf.shape)
    #
    # wordlist = vector.get_feature_names()#获取词袋模型中的所有词
    # #tf-idf矩阵 元素a[i][j]表示j词在i类文本中的tf-idf权重
    # weightlist = tfidf.toarray()
    # print(weightlist)
    # for i in range(len(weightlist)):
    #     print("-------第",i,"段文本的词语tf-idf权重------"  )
    #     for j in range(len(wordlist)):
    #         print(wordlist[j],weightlist[i][j])
    
    #统计词频
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.decomposition import LatentDirichletAllocation
    from sklearn.externals import joblib
    import pickle
    corpus1 = [res1]
    cntVector = CountVectorizer(stop_words=stopwrd_list)
    cntTf = cntVector.fit_transform(corpus1)
    joblib.dump(cntVector, "cntVector")#保存cntVector,避免二次运算
    print(cntTf)
    print(cntTf.toarray())#矩阵,文档-词频
    #模型训练
    lda = LatentDirichletAllocation(n_components=2, max_iter=5,learning_method='online',learning_offset=50.,random_state=0)
    docres = lda.fit(cntTf)
    with open("lda.pickle", "wb") as fw:
        pickle.dump(docres,fw)
    print(docres)
    
    #topic top words
    def print_top_words(lda, features_names, n_top_words):
        for topic_idx, topic in enumerate(lda.components_):
            print("Topic#%d"%topic_idx)
            print(" ".join([features_names[i] for i in topic.argsort()[:-n_top_words-1:-1]]))
    n_top_words = 50
    tf_fearures_names = cntVector.get_feature_names()
    print_top_words(lda,tf_fearures_names,n_top_words)
    
    
    #预测
    cut_content("nlp_test2.txt")
    res2 = get_corpus("cut_nlp_test2.txt")
    corpus2 = [res2]
    cntVectorload = joblib.load("cntVector")
    print(cntVectorload)
    cntTf2 = cntVectorload.transform(corpus2)
    print(cntTf2)
    cntTf2.toarray()
    with open("lda.pickle", "rb") as fr:
        lda = pickle.load(fr)
    topic_dist = lda.transform(cntTf2)
    print(topic_dist)
    

    3、结果分析

    返回的是主题矩阵,预测文本属于那个主题的概率。
    可以通过查看主题词分布,获取预测文本的主题词分布
    在这里插入图片描述

    LDA 原理

    1、狄利克雷函数

    Dirichlet function
    定义:定义在实数范围内、值域不连续的函数。以Y轴为对称轴,偶函数,处处不连续。
    值域的取值为{0,1},当x为有理数时,D(x)=1,无理数时,D(x)=0。

    2、狄利克雷分布

    在这里插入图片描述

    3、共轭分布

    LDA贝叶斯模型

    LDA是贝叶斯模型的,有3块构成:

                先验分布 + 似然(数据) = 后验分布
    

    例如:好人坏人,
    先验分布:100好人,100坏人
    数据:2个好人,1个坏人
    后验分布:102好人,101坏人
    这个后验分布变更成了下一次的先验分布,依次更新下去。

    二项分布和BETA分布
    • 二项分布(似然):在这里插入图片描述

    • 先验分布

    希望先验分布 + 似然(二项分布)得到的后验分布能够作为下一次的先验分布。为此我们希望找到一个与二项式分布共轭的分布,即Beta分布。
    在这里插入图片描述

    • 后验概率
      [外链图片转存失败(img-E44ma05b-1567562386996)(en-resource://database/2003:1)]
      可见后验概率确实为Beta分布。
      在这里插入图片描述

    • 期望
      在这里插入图片描述

    多项分布和Dirichlet分布

    根据上面的二项分布和Beta分布进行延申,对应于多项分布和Dirichlet分布。

    • 似然:(多项式分布)
      在这里插入图片描述* 先验概率
      在这里插入图片描述
      在这里插入图片描述

    4、LDA主题模型


    在这里插入图片描述
    在这里插入图片描述

    主题-词分布是基于语料的,而文档主题分布是基于一篇文档的。
    则对于一篇文本,首先通过Dirichlet-Multi分布确定主题分布,针对某个一主题根据训练好的DIrichlet-Multi分布确定词分布。示例如下:
    在这里插入图片描述

    展开全文
  • LDA的时间主题模型,Python实现代码,带输入数据和停用词,运行无误
  • 主题模型介绍

    2013-11-29 09:23:19
    文中介绍了当前比较主流的主题模型LSA.PLSA ,LDA等,同时分析了其演化过程和关联关系。另外,介绍了LDA的一些变种。对于学习主题模型的同学来说,这是一个相当不错的总结。
  • 上下文化主题模型(CTM)是一系列主题模型,这些主题模型使用语言的预训练表示形式(例如BERT)来支持主题建模。有关详细信息,请参见论文: Bianchi,F.,Terragni,S.,Hovy,D.,Nozza,D.,&Fersini,E.(2021...
  • 为解决此问题,提出了一种基于语义分布相似度的主题模型。该模型在EM(expectation maximization)算法框架下,使用GPU(generalized Pólya urn)模型加入单词—单词和文档—主题语义分布相似度来引导主题建模,从语义关联...
  • 本本章上关于主题模型在个性化新闻推荐系统上的应用,以推测读者意图,来依据个性化进行新闻推荐
  • 本身,微博能够着重于自身的特点发展成为社会公共舆论的重要平台,对国家安全和社会发展产生了...近一步,又概述了利用主题模型发现基于主题的社团关系的研究;最后总结了未来主题模型在挖掘微博主题方面存在的挑战。
  • 通俗理解LDA主题模型.pdf通俗理解LDA主题模型.pdf通俗理解LDA主题模型.pdf通俗理解LDA主题模型.pdf通俗理解LDA主题模型.pdf通俗理解LDA主题模型.pdf
  • 实体主题模型

    2015-03-27 21:29:09
    本文主要对已有的主题模型做了系统的简介并对主题模型在结构化数据上的一些应用,此外还提出新的主题模型即实体主题模型
  • LDA主题模型简介及Python实现

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

    一、LDA主题模型简介

            LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。

            LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-of-word feature)来代表文档。词袋模型介绍可以参考这篇文章:文本向量化表示——词袋模型 - 知乎

            了解LDA模型,我们需要先了解LDA的生成模型,LDA认为一篇文章是怎么形成的呢?

            LDA模型认为主题可以由一个词汇分布来表示,而文章可以由主题分布来表示

            比如有两个主题,美食美妆。LDA说两个主题可以由词汇分布表示,他们分别是:

    {面包:0.4,火锅:0.5,眉笔:0.03,腮红:0.07}
    {眉笔:0.4,腮红:0.5,面包:0.03,火锅:0.07}

            同样,对于两篇文章,LDA认为文章可以由主题分布这么表示:

    《美妆日记》{美妆:0.8,美食:0.1,其他:0.1}

    《美食探索》{美食:0.8,美妆:0.1,其他:0.1}

            所以想要生成一篇文章,可以先以一定的概率选取上述某个主题,再以一定的概率选取那个主题下的某个单词,不断重复这两步就可以生成最终文章。

            在LDA模型中,一篇文档生成的方式如下:

     

            其中,类似Beta分布是二项式分布的共轭先验概率分布,而狄利克雷分布(Dirichlet分布)是多项式分布的共轭先验概率分布。

            如果我们要生成一篇文档,它里面的每个词语出现的概率为:

             更详细的数学推导可以见:通俗理解LDA主题模型_结构之法 算法之道-CSDN博客_lda模型

            看到文章推断其隐藏的主题分布,就是建模的目的。换言之,人类根据文档生成模型写成了各类文章,然后丢给了计算机,相当于计算机看到的是一篇篇已经写好的文章。现在计算机需要根据一篇篇文章中看到的一系列词归纳出当篇文章的主题,进而得出各个主题各自不同的出现概率:主题分布。

            至于LDA主题模型在计算机中具体是怎么实现的,我们也可以不必细究,现在有很多可以直接用来进行LDA主题分析的包,我们直接用就行。(没错,我就是调包侠)

    二、Python实现

            在用Python进行LDA主题模型分析之前,我先对文档进行了分词和去停用词处理(详情可以看我之前的文章:用python对单一微博文档进行分词——jieba分词(加保留词和停用词)_阿丢是丢心心的博客-CSDN博客_jieba 停用词

            我下面的输入文件也是已经分好词的文件

    1.导入算法包

    import gensim
    from gensim import corpora
    import matplotlib.pyplot as plt
    import matplotlib
    import numpy as np
    import warnings
    warnings.filterwarnings('ignore')  # To ignore all warnings that arise here to enhance clarity
    
    from gensim.models.coherencemodel import CoherenceModel
    from gensim.models.ldamodel import LdaModel
    

    2.加载数据

            先将文档转化为一个二元列表,其中每个子列表代表一条微博:

    PATH = "E:/data/output.csv"
    
    file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容
    data_set=[]  #建立存储分词的列表
    for i in range(len(file_object2)):
        result=[]
        seg_list = file_object2[i].split()
        for w in seg_list :  #读取每一行分词
            result.append(w)
        data_set.append(result)
    print(data_set)
    

            构建词典,语料向量化表示:

    dictionary = corpora.Dictionary(data_set)  # 构建词典
    corpus = [dictionary.doc2bow(text) for text in data_set]  #表示为第几个单词出现了几次

    3.构建LDA模型

    ldamodel = LdaModel(corpus, num_topics=10, id2word = dictionary, passes=30,random_state = 1)   #分为10个主题
    print(ldamodel.print_topics(num_topics=num_topics, num_words=15))  #每个主题输出15个单词

            这是确定主题数时LDA模型的构建方法,一般我们可以用指标来评估模型好坏,也可以用这些指标来确定最优主题数。一般用来评价LDA主题模型的指标有困惑度(perplexity)和主题一致性(coherence),困惑度越低或者一致性越高说明模型越好。一些研究表明perplexity并不是一个好的指标,所以一般我用coherence来评价模型并选择最优主题,但下面代码两种方法我都用了。

    #计算困惑度
    def perplexity(num_topics):
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30)
        print(ldamodel.print_topics(num_topics=num_topics, num_words=15))
        print(ldamodel.log_perplexity(corpus))
        return ldamodel.log_perplexity(corpus)
    #计算coherence
    def coherence(num_topics):
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30,random_state = 1)
        print(ldamodel.print_topics(num_topics=num_topics, num_words=10))
        ldacm = CoherenceModel(model=ldamodel, texts=data_set, dictionary=dictionary, coherence='c_v')
        print(ldacm.get_coherence())
        return ldacm.get_coherence()

    4.绘制主题-coherence曲线,选择最佳主题数

    x = range(1,15)
    # z = [perplexity(i) for i in x]  #如果想用困惑度就选这个
    y = [coherence(i) for i in x]
    plt.plot(x, y)
    plt.xlabel('主题数目')
    plt.ylabel('coherence大小')
    plt.rcParams['font.sans-serif']=['SimHei']
    matplotlib.rcParams['axes.unicode_minus']=False
    plt.title('主题-coherence变化情况')
    plt.show()

            最终能得到各主题的词语分布和这样的图形:

     5.结果输出与可视化

            通过上述主题评估,我们发现可以选择5作为主题个数,接下来我们可以再跑一次模型,设定主题数为5,并输出每个文档最有可能对应的主题

    from gensim.models import LdaModel
    import pandas as pd
    from gensim.corpora import Dictionary
    from gensim import corpora, models
    import csv
    
    # 准备数据
    PATH = "E:/data/output1.csv"
    
    file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容
    data_set=[] #建立存储分词的列表
    for i in range(len(file_object2)):
        result=[]
        seg_list = file_object2[i].split()
        for w in seg_list :#读取每一行分词
            result.append(w)
        data_set.append(result)
    
    dictionary = corpora.Dictionary(data_set)  # 构建词典
    corpus = [dictionary.doc2bow(text) for text in data_set]
    
    lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, passes = 30,random_state=1)
    topic_list=lda.print_topics()
    print(topic_list)
    
    for i in lda.get_document_topics(corpus)[:]:
        listj=[]
        for j in i:
            listj.append(j[1])
        bz=listj.index(max(listj))
        print(i[bz][0])

            同时我们可以用pyLDAvis对LDA模型结果进行可视化:

    import pyLDAvis.gensim
    pyLDAvis.enable_notebook()
    data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
    pyLDAvis.save_html(data, 'E:/data/3topic.html')

            大概能得到这样的结果:

     左侧圆圈表示主题,右侧表示各个词语对主题的贡献度。

    所有代码如下:

    import gensim
    from gensim import corpora
    import matplotlib.pyplot as plt
    import matplotlib
    import numpy as np
    import warnings
    warnings.filterwarnings('ignore')  # To ignore all warnings that arise here to enhance clarity
    
    from gensim.models.coherencemodel import CoherenceModel
    from gensim.models.ldamodel import LdaModel
    
    
    
     # 准备数据
    PATH = "E:/data/output.csv"
    
    file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容
    data_set=[] #建立存储分词的列表
    for i in range(len(file_object2)):
        result=[]
        seg_list = file_object2[i].split()
        for w in seg_list :#读取每一行分词
            result.append(w)
        data_set.append(result)
    print(data_set)
    
    
    dictionary = corpora.Dictionary(data_set)  # 构建 document-term matrix
    corpus = [dictionary.doc2bow(text) for text in data_set]
    #Lda = gensim.models.ldamodel.LdaModel  # 创建LDA对象
    
    #计算困惑度
    def perplexity(num_topics):
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30)
        print(ldamodel.print_topics(num_topics=num_topics, num_words=15))
        print(ldamodel.log_perplexity(corpus))
        return ldamodel.log_perplexity(corpus)
    
    #计算coherence
    def coherence(num_topics):
        ldamodel = LdaModel(corpus, num_topics=num_topics, id2word = dictionary, passes=30,random_state = 1)
        print(ldamodel.print_topics(num_topics=num_topics, num_words=10))
        ldacm = CoherenceModel(model=ldamodel, texts=data_set, dictionary=dictionary, coherence='c_v')
        print(ldacm.get_coherence())
        return ldacm.get_coherence()
    
    # 绘制困惑度折线图
    x = range(1,15)
    # z = [perplexity(i) for i in x]
    y = [coherence(i) for i in x]
    plt.plot(x, y)
    plt.xlabel('主题数目')
    plt.ylabel('coherence大小')
    plt.rcParams['font.sans-serif']=['SimHei']
    matplotlib.rcParams['axes.unicode_minus']=False
    plt.title('主题-coherence变化情况')
    plt.show()
    from gensim.models import LdaModel
    import pandas as pd
    from gensim.corpora import Dictionary
    from gensim import corpora, models
    import csv
    
    # 准备数据
    PATH = "E:/data/output1.csv"
    
    file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')  #一行行的读取内容
    data_set=[] #建立存储分词的列表
    for i in range(len(file_object2)):
        result=[]
        seg_list = file_object2[i].split()
        for w in seg_list :#读取每一行分词
            result.append(w)
        data_set.append(result)
    
    dictionary = corpora.Dictionary(data_set)  # 构建 document-term matrix
    corpus = [dictionary.doc2bow(text) for text in data_set]
    
    lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=5, passes = 30,random_state=1)
    topic_list=lda.print_topics()
    print(topic_list)
    
    result_list =[]
    for i in lda.get_document_topics(corpus)[:]:
        listj=[]
        for j in i:
            listj.append(j[1])
        bz=listj.index(max(listj))
        result_list.append(i[bz][0])
    print(result_list)
    import pyLDAvis.gensim
    pyLDAvis.enable_notebook()
    data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
    pyLDAvis.save_html(data, 'E:/data/topic.html')

    有需要自取~

    还可以关注我,之后我还会发更多关于数据分析的干货文章~

    展开全文
  • 主题模型工具箱(matlab)

    热门讨论 2013-01-18 13:09:46
    matalab的lda及几种变形的主题分析模型的matalab代码集合
  • LDA主题模型代码

    2017-04-24 21:19:48
    LDA主题模型代码
  • 结构主题模型(一)stm包工作流

    千次阅读 热门讨论 2022-02-11 22:25:23
    对论文(`stm: An R Package for Structural Topic Models`)中stm代码的工作流进行梳理,总体结构参考论文原文,但对部分代码执行的顺序提出个人想法。...最后,希望对使用STM结构主题模型的朋友们有帮助

    前言

    对论文(stm: An R Package for Structural Topic Models)中stm代码的工作流进行梳理,总体结构参考论文原文,但对部分代码执行的顺序提出个人想法。因时间有限,存在未能解决的问题(如选择合适的主题数……),论文后面的部分内容仍未详细叙述,后续有时间将会补充。若有朋友能提出有效的修改建议和解决方案,博主将在第一时间做出反馈。最后,希望对使用STM结构主题模型的朋友们有帮助😁

    论文复现过程中的相关问题汇总
    结构主题模型(二)复现

    论文原文、数据及代码
    stm: An R Package for Structural Topic Model

    stm库官方文档



    3.0 读取数据

    样例数据poliblogs2008.csv为一个关于美国政治的博文集,来自CMU2008年政治博客语料库:American Thinker, Digby, Hot Air, Michelle Malkin, Think Progress, and Talking Points Memo。每个博客论坛都有自己的政治倾向,所以每篇博客都有写作日期和政治意识形态的元数据。

    建议读取xlsx,因为csv文件以逗号作为分隔符,有时会出现问题。pandas:csv-excel文件相互转换

    # data <- read.csv("./poliblogs2008.csv", sep =",", quote = "", header = TRUE, fileEncoding = "UTF-8")
    data <- read_excel(path = "./poliblogs2008.xlsx", sheet = "Sheet1", col_names = TRUE)
    

    若数据为中文,可参考以下文章对中文文本进行分词等预处理操作后,再进行后续步骤

    1. 读取word文件中的文本信息
    2. 中文文本预处理

    以3.0为开始序号是为了和论文原文保持一致

    3.1 Ingest: Reading and processing text data

    提取数据:将原始数据处理成STM可以分析的三块内容(分别是documentsvocabmeta),用到的是textProcessorreadCorpus这两个函数。

    textProcessor()函数旨在提供一种方便快捷的方式来处理相对较小的文本,以便使用软件包进行分析。它旨在以简单的形式快速摄取数据,例如电子表格,其中每个文档都位于单个单元格中。

    # 调用textProcessor算法,将 data$document、data 作为参数
    processed <- textProcessor(documents = data$documents, metadata = data, wordLengths = c(1, Inf))
    

    textProcessor()函数中的参数wordLengths = c(3, Inf)表示:短于最小字长(默认为3字符)或长于最大字长(默认为inf)的字数将被丢弃,[用户@qq_39172034]建议设置该参数为wordLengths = c(1, Inf),以避免避免单个汉字被删除

    论文中提到,textProcessor()可以处理多种语言,需设置变量language = "en", customstopwords = NULL,。截至0.5支持的版本“丹麦语、荷兰语、英语、芬兰语、法语、德语、匈牙利语、意大利语、挪威语、葡萄牙语、罗马尼亚语、俄语、瑞典语、土耳其语”,不支持中文
    详见:textProcessor function - RDocumentation

    3.2 Prepare: Associating text with metadata

    数据预处理:转换数据格式,根据阈值删除低频单词等,用到的是prepDocuments()plotRemoved()两个函数

    plotRemoved()函数可绘制不同阈值下删除的document、words、token数量

    pdf("output/stm-plot-removed.pdf")
    plotRemoved(processed$documents, lower.thresh = seq(1, 200, by = 100))
    dev.off()
    

    image-20220212193043422

    根据此pdf文件的结果(output/stm-plot-removed.pdf),确定prepDocuments()中的参数lower.thresh的取值,以此确定变量docsvocabmeta

    论文中提到如果在处理过程中发生任何更改,PrepDocuments还将重新索引所有元数据/文档关系。例如,当文档因为含有低频单词而在预处理阶段被完全删除,那么PrepDocuments()也将删除元数据中的相应行。因此在读入和处理文本数据后,检查文档的特征和相关词汇表以确保它们已被正确预处理是很重要的。

    # 去除词频低于15的词汇
    out <- prepDocuments(documents = processed$documents, vocab = processed$vocab, meta = processed$meta, lower.thresh = 15)
    
    docs <- out$documents
    vocab <- out$vocab
    meta <- out$meta
    
    • docs:documents。包含单词索引及其相关计数的文档列表

    • vocab:a vocab character vector。包含与单词索引关联的单词

    • meta:a metadata matrix。包含文档协变量

    以下表示两篇短文章documents:第一篇文章包含5个单词,每个单词出现在vocab vector的第21、23、87、98、112位置上,除了第一个单词出现两次,其余单词都仅出现一次。第二篇文章包含3个单词,解释同上。

    [[1]]
    [,1][,2][,3][,4][,5]
    [1,]21238798112
    [2,]21111
    [[2]][,1][,2][,3]
    [1,]166190
    [2,]111

    3.3 Estimate: Estimating the structural topic model

    STM的关键创新是它将元数据合并到主题建模框架中。在STM中,元数据可以通过两种方式输入到主题模型中:**主题流行度(topical prevalence)**和主题内容(topical content)。主题流行度中的元数据协变量允许观察到的元数据影响被讨论主题的频率。主题内容中的协变量允许观察到的元数据影响给定主题内的词率使用——即如何讨论特定主题。对主题流行率和主题内容的估计是通过stm()函数进行的。

    主题流行度(topical prevalence)表示每个主题对某篇文档的贡献程度,因为不同的文档来自不同的地方,所以自然地希望主题流行度能随着元数据的变化而变化。

    具体而言,论文将变量rating(意识形态,Liberal,Conservative)作为主题流行度的协变量,除了意识形态,还可以通过+号增加其他协变量,如增加原始数据中的day”变量(表示发帖日期)

    s(day)中的s()为spline function,a fairly flexible b-spline basis

    day这个变量是从2008年的第一天到最后一天,就像panel data一样,如果带入时序设置为天(365个penal),则会损失300多个自由度,所以引入spline function解决自由度损失的问题。

    The stm package also includes a convenience functions(), which selects a fairly flexible b-spline basis. In the current example we allow for the variabledayto be estimated with a spline.

    poliblogPrevFit <- stm(documents = out$documents, vocab = out$vocab, K = 20, prevalence = ~rating + s(day), max.em.its = 75, data = out$meta, init.type = "Spectral")
    

    R中主题流行度协变量prevalence能表示为含有多个斜变量和阶乘或连续协变量的公式,在spline包中还有其他的标准转换函数:log()、ns()、bs()

    随着迭代的进行,如果bound变化足够小,则认为模型收敛converge了。

    3.4 Evaluate: Model selection and search

    1. Model initialization for a fixed number of topics 为指定数量的主题数创建初始化模型

    因为混合主题模型的后验往往非凸和难以解决,模型的确定取决于参数的起始值(例如,特定主题的单词分布)。两种实现模型初始化的方式:

    • spectral initialization。init.type="Spectral"。优先选取此方式
    • a collapsed Gibbs sampler for LDA
    poliblogPrevFit <- stm(documents = out$documents, vocab = out$vocab, K = 20, prevalence = ~rating + s(day), max.em.its = 75, data = out$meta, init.type = "Spectral")
    
    1. Model selection for a fixed number of topics 为指定数量的主题数选择模型
    poliblogSelect <- selectModel(out$documents, out$vocab, K = 20, prevalence = ~rating + s(day), max.em.its = 75, data = out$meta, runs = 20, seed = 8458159)
    

    selectModel()首先建立一个运行模型的网络(net),并依次将所有模型运行(小于10次)E step和M step,抛弃低likelihood的模型,接着仅运行高likelihood的前20%的模型,直到收敛(convergence)或达到最大迭代次数(max.em.its)

    通过plotModels()函数显示的语义一致性(semantic coherence)和排他性(exclusivity)选择合适的模型,semcoh和exclu越大则模型越好

    # 绘制图形平均得分每种模型采用不同的图例
    plotModels(poliblogSelect, pch=c(1,2,3,4), legend.position="bottomright")
    # 选择模型3
    selectedmodel <- poliblogSelect$runout[[3]]
    

    image-20220212193152168

    1. Model search across numbers of topics 确定合适的主题数
    storage <- searchK(out$documents, out$vocab, K = c(7, 10), prevalence = ~rating + s(day), data = meta)
    
    # 借助图表可视化的方式直观选择主题数
    pdf("stm-plot-ntopics.pdf")
    plot(storage)
    dev.off()
    
    # 借助实际数据选择主题数
    t <- storage$out[[1]]
    t <- storage$out[[2]]
    

    对比两种或多个主题数,通过对比语义连贯性SemCoh和排他性Exl确定合适的主题数

    image-20220211222326747

    3.5 Understand: Interpreting the STM by plotting and inspecting results

    选择好模型后,就是通过stm包中提供的一些函数来展示模型的结果。为与原论文保持一致,使用初始模型poliblogPrevFit作为参数,而非SelectModel

    每个主题下的高频单词排序:labelTopics()sageLabels()

    两个函数都将与每个主题相关的单词输出,其中sageLabels()仅对于包含内容协变量的模型使用。此外,sageLabels()函数结果比labelTopics()更详细,而且默认输出所有主题下的高频词等信息

    # labelTopics() Label topics by listing top words for selected topics 1 to 5.
    labelTopicsSel <- labelTopics(poliblogPrevFit, c(1:5))
    sink("output/labelTopics-selected.txt", append=FALSE, split=TRUE)
    print(labelTopicsSel)
    sink()
    
    # sageLabels() 比 labelTopics() 输出更详细
    sink("stm-list-sagelabel.txt", append=FALSE, split=TRUE)
    print(sageLabels(poliblogPrevFit))
    sink()
    

    TODO:两个函数输出结果存在差异

    列出与某个主题高度相关的文档:findthoughts()

    shortdoc <- substr(out$meta$documents, 1, 200)
    # 参数 'texts=shortdoc' 表示输出每篇文档前200个字符,n表示输出相关文档的篇数
    thoughts1 <- findThoughts(poliblogPrevFit, texts=shortdoc, n=2, topics=1)$docs[[1]]
    pdf("findThoughts-T1.pdf")
    plotQuote(thoughts1, width=40, main="Topic 1")
    dev.off()
    
    # how about more documents for more of these topics?
    thoughts6 <- findThoughts(poliblogPrevFit, texts=shortdoc, n=2, topics=6)$docs[[1]]
    thoughts18 <- findThoughts(poliblogPrevFit, texts=shortdoc, n=2, topics=18)$docs[[1]]
    pdf("stm-plot-find-thoughts.pdf")
    # mfrow=c(2, 1)将会把图输出到2行1列的表格中
    par(mfrow = c(2, 1), mar = c(.5, .5, 1, .5))
    plotQuote(thoughts6, width=40, main="Topic 6")
    plotQuote(thoughts18, width=40, main="Topic 18")
    dev.off()
    

    估算元数据和主题/主题内容之间的关系:estimateEffect

    out$meta$rating<-as.factor(out$meta$rating)
    # since we're preparing these coVariates by estimating their effects we call these estimated effects 'prep'
    # we're estimating Effects across all 20 topics, 1:20. We're using 'rating' and normalized 'day,' using the topic model poliblogPrevFit. 
    # The meta data file we call meta. We are telling it to generate the model while accounting for all possible uncertainty. Note: when estimating effects of one covariate, others are held at their mean
    prep <- estimateEffect(1:20 ~ rating+s(day), poliblogPrevFit, meta=out$meta, uncertainty = "Global")
    summary(prep, topics=1)
    summary(prep, topics=2)
    summary(prep, topics=3)
    summary(prep, topics=4)
    

    uncertainty有"Global", “Local”, "None"三个选择,The default is “Global”, which will incorporate estimation uncertainty of the topic proportions into the uncertainty estimates using the method of composition. If users do not propagate the full amount of uncertainty, e.g., in order to speed up computational time, they can choose uncertainty = “None”, which will generally result in narrower confidence intervals because it will not include the additional estimation uncertainty.

    summary(prep, topics=1)输出结果:

    Call:
    estimateEffect(formula = 1:20 ~ rating + s(day), stmobj = poliblogPrevFit, 
        metadata = meta, uncertainty = "Global")
    
    
    Topic 1:
    
    Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
    (Intercept)    0.068408   0.011233   6.090 1.16e-09 ***
    ratingLiberal -0.002513   0.002588  -0.971  0.33170    
    s(day)1       -0.008596   0.021754  -0.395  0.69276    
    s(day)2       -0.035476   0.012314  -2.881  0.00397 ** 
    s(day)3       -0.002806   0.015696  -0.179  0.85813    
    s(day)4       -0.030237   0.013056  -2.316  0.02058 *  
    s(day)5       -0.026256   0.013791  -1.904  0.05695 .  
    s(day)6       -0.010658   0.013584  -0.785  0.43269    
    s(day)7       -0.005835   0.014381  -0.406  0.68494    
    s(day)8        0.041965   0.016056   2.614  0.00897 ** 
    s(day)9       -0.101217   0.016977  -5.962 2.56e-09 ***
    s(day)10      -0.024237   0.015679  -1.546  0.12216    
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    

    3.6 Visualize: Presenting STM results

    Summary visualization

    主题占比条形图

    # see PROPORTION OF EACH TOPIC in the entire CORPUS. Just insert your STM output
    pdf("top-topic.pdf")
    plot(poliblogPrevFit, type = "summary", xlim = c(0, .3))
    dev.off()
    

    Metadata/topic relationship visualization

    主题关系对比图

    pdf("stm-plot-topical-prevalence-contrast.pdf")
    plot(prep, covariate = "rating", topics = c(6, 13, 18),
         model = poliblogPrevFit, method = "difference",
         cov.value1 = "Liberal", cov.value2 = "Conservative",
         xlab = "More Conservative ... More Liberal",
         main = "Effect of Liberal vs. Conservative",
         xlim = c(-.1, .1), labeltype = "custom",
         custom.labels = c("Obama/McCain", "Sarah Palin", "Bush Presidency"))
    dev.off()
    

    主题6、13、18自定义标签为"Obama/McCain"、“Sarah Palin”、“Bush Presidency”,主题6、主题13的意识形态偏中立,既不是保守,也不是自由,主题18的意识形态偏向于保守。

    主题随着时间变化的趋势图

    pdf("stm-plot-topic-prevalence-with-time.pdf")
    plot(prep, "day", method = "continuous", topics = 13, 
         model = z, printlegend = FALSE, xaxt = "n", xlab = "Time (2008)")
    monthseq <- seq(from = as.Date("2008-01-01"), to = as.Date("2008-12-01"), by = "month")
    monthnames <- months(monthseq)
    # There were 50 or more warnings (use warnings() to see the first 50)
    axis(1, at = as.numeric(monthseq) - min(as.numeric(monthseq)), labels = monthnames)
    dev.off()
    

    运行报错,但可以输出以下图片,原因不明

    image-20220210112429174

    topic content

    显示某主题中哪些词汇与一个变量值与另一个变量值的关联度更大。

    # TOPICAL CONTENT.
    # STM can plot the influence of covariates included in as a topical content covariate.
    # A topical content variable allows for the vocabulary used to talk about a particular 
    # topic to vary. First, the STM must be fit with a variable specified in the content option.
    # Let's do something different. Instead of looking at how prevalent a topic is in a class of documents categorized by meta-data covariate... 
    # ... let's see how the words of the topic are emphasized differently in documents of each category of the covariate
    # First, we we estimate a new stm. It's the same as the old one, including prevalence option, but we add in a content option
    poliblogContent <- stm(out$documents, out$vocab, K = 20, 
                           prevalence = ~rating + s(day), content = ~rating, 
                           max.em.its = 75, data = out$meta, init.type = "Spectral")
    pdf("stm-plot-content-perspectives.pdf")
    plot(poliblogContent, type = "perspectives", topics = 10)
    dev.off()
    

    image-20220211221912494

    主题10与古巴有关。它最常用的词是“拘留、监禁、法庭、非法、酷刑、强制执行、古巴”。上显示了自由派和保守派对这个主题的不同看法,自由派强调“酷刑”,而保守派则强调“非法”和“法律”等典型的法庭用语

    原文:Its top FREX words were “detaine, prison, court, illeg, tortur, enforc, guantanamo”中的tortur应为torture

    绘制主题间的词汇差异

    pdf("stm-plot-content-perspectives-16-18.pdf")
    plot(poliblogPrevFit, type = "perspectives", topics = c(16, 18))
    dev.off()
    

    image-20220211221531073

    Plotting covariate interactions

    # Interactions between covariates can be examined such that one variable may ??moderate??
    # the effect of another variable.
    ###Interacting covariates. Maybe we have a hypothesis that cities with low $$/capita become more repressive sooner, while cities with higher budgets are more patient 
    ##first, we estimate an STM with the interaction
    poliblogInteraction <- stm(out$documents, out$vocab, K = 20,
                               prevalence = ~rating * day, max.em.its = 75,
                               data = out$meta, init.type = "Spectral")
    # Prep covariates using the estimateEffect() function, only this time, we include the 
    # interaction variable. Plot the variables and save as pdf files.
    prep <- estimateEffect(c(16) ~ rating * day, poliblogInteraction,
                           metadata = out$meta, uncertainty = "None")
    pdf("stm-plot-two-topic-contrast.pdf")
    plot(prep, covariate = "day", model = poliblogInteraction,
         method = "continuous", xlab = "Days", moderator = "rating",
         moderator.value = "Liberal", linecol = "blue", ylim = c(0, 0.12),
         printlegend = FALSE)
    plot(prep, covariate = "day", model = poliblogInteraction,
         method = "continuous", xlab = "Days", moderator = "rating",
         moderator.value = "Conservative", linecol = "red", add = TRUE,
         printlegend = FALSE)
    legend(0, 0.06, c("Liberal", "Conservative"),
           lwd = 2, col = c("blue", "red"))
    dev.off()
    

    image-20220210111313901

    上图描绘了时间(博客发帖的日子)和评分(自由派和保守派)之间的关系。主题16患病率以时间的线性函数绘制,评分为0(自由)或1(保守)。

    3.7 Extend: Additional tools for interpretation and visualization

    绘制词云图

    pdf("stm-plot-wordcloud.pdf")
    cloud(poliblogPrevFit, topic = 13, scale = c(2, 0.25))
    dev.off()
    

    image-20220211221637379

    主题相关性

    # topicCorr().
    # STM permits correlations between topics. Positive correlations between topics indicate
    # that both topics are likely to be discussed within a document. A graphical network
    # display shows how closely related topics are to one another (i.e., how likely they are
    # to appear in the same document). This function requires 'igraph' package.
    # see GRAPHICAL NETWORK DISPLAY of how closely related topics are to one another, (i.e., how likely they are to appear in the same document) Requires 'igraph' package
    mod.out.corr <- topicCorr(poliblogPrevFit)
    pdf("stm-plot-topic-correlations.pdf")
    plot(mod.out.corr)
    dev.off()
    

    image-20220211221706419

    stmCorrViz

    stmCorrViz软件包提供了一个不同的d3可视化环境,该环境侧重于使用分层聚类方法将主题分组,从而可视化主题相关性。

    存在乱码问题

    # The stmCorrViz() function generates an interactive visualisation of topic hierarchy/correlations in a structural topicl model. The package performs a hierarchical
    # clustering of topics that are then exported to a JSON object and visualised using D3.
    # corrViz <- stmCorrViz(poliblogPrevFit, "stm-interactive-correlation.html", documents_raw=data$documents, documents_matrix=out$documents)
    
    stmCorrViz(poliblogPrevFit, "stm-interactive-correlation.html", 
               documents_raw=data$documents, documents_matrix=out$documents)
    

    image-20220211221813396

    4 Changing basic estimation defaults

    此部分为解释如何更改stm包的估算命令中的默认设置

    首先讨论如何在初始化模型参数的不同方法中进行选择,然后讨论如何设置和评估收敛标准,再描述一种在分析包含数万个或更多文档时加速收敛的方法,最后,讨论内容协变量模型的一些变化,这些变化允许用户控制模型的复杂性。


    问题

    ems.its和run的区别是什么?ems.its表示的组大迭代数,每次迭代run=20?

    3.4-3中如何根据四个图确定合适的主题数?

    补充

    Ingest部分,作者提到其他用于文本处理的quanteda包,该包可以方便地导入文本和相关元数据,准备要处理的文本,并将文档转换为文档术语矩阵(document-term matrix)。另一个包,readtext包含非常灵活的工具,用于读取多种文本格式,如纯文本、XML和JSON格式,可以轻松地从中创建语料库。

    为从其他文本处理程序中读取数据,可使用txtorg,此程序可以创建三种独立的文件:a metadata file, a vocabulary file, and a file with the original documents。默认导出格式为LDA-C sparse matrix format,可以用readCorpus()设置"ldac"option以读取


    论文:stm: An R Package for Structural Topic Models (harvard.edu)

    参考文章:R软件 STM package实操- 哔哩哔哩 (bilibili.com)

    相关github仓库:

    JvH13/FF-STM: Web Appendix - Methodology for Structural Topic Modeling (github.com)

    dondealban/learning-stm: Learning structural topic modeling using the stm R package. (github.com)

    bstewart/stm: An R Package for the Structural Topic Model (github.com)

    展开全文
  • 基于gensim的文本主题模型(LDA)分析

    热门讨论 2016-01-05 20:52:00
    博客《基于gensim的文本主题模型(LDA)分析》对应文档
  • NLP之主题模型

    千次阅读 2020-05-09 16:56:31
    一、主题模型  两篇文档是否相关往往不只决定于字面上的词语重复,还取决于文字背后的语义关联。对语义关联的挖掘,可以让我们的搜索更加智能化。本文着重介绍了一个语义挖掘的利器:主题模型主题模型是对文字...
  • LDA主题模型

    千次阅读 2019-06-04 11:29:45
    LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,这个模型包含了词、主题和文档三层结构。所谓的生成模型,就是说我们人为一篇文章的每个词都是通过 “以一定概率选择了某个主题,并从这个主题中以一定...
  • LDA主题模型的原理及使用教程

    千次阅读 热门讨论 2021-08-08 17:43:44
    LDA主题模型是Blei等人于2003年提出的一种文档主题生成模型,包括文档、主题和词项3个层级结构。LDA常被用于识别语料中潜在的主题信息。 LDA认为第m篇文档的生成方式如下: 1.对每个主题k∈[1,K],生成“主题-词项”...
  • LDA主题模型 | 原理详解与代码实战

    千次阅读 2021-01-17 12:44:17
    一是本文要讲的「隐含狄利克雷分布(Latent Dirichlet Allocation)」,是一种概率主题模型,主要用来文本分类,在NLP领域有重要应用。LDA由Blei, David M.、Ng, Andrew Y.、Jordan于2003年提出...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 219,772
精华内容 87,908
关键字:

主题模型