【机器学习】LDA算法 (主题模型算法)

随着互联网的发展,文本分析越来越受到重视。由于文本格式的复杂性,人们往往很难直接利用文本进行分析。因此一些将文本数值化的方法就出现了。LDA就是其中一种很NB的方法。 LDA有着很完美的理论支撑,而且有着维度小等一系列优点。本文对LDA算法进行介绍,欢迎批评指正。

 

本文目录:

1、Gamma函数

2、Dirichlet分布

3、LDA文本建模

4、吉普斯抽样概率公式推导

5、使用LDA

 

 

1、Gamma函数

T(x)= ∫ tx-1 e-tdt    T(x+1) = xT(x)

若x为整数,则有 T(n) = (n-1)!

 

2、Dirichlet分布

这里抛出两个问题:

问题1: (1) X1, X2......Xn 服从Uniform(0,1)

            (2) 排序后的顺序统计量为X(1), X(2), X(3)......X(n)

    (3) 问X(k1)和X(k1+k2)的联合分布式什么

把整个概率区间分成[0,X1) ,  [X1, X1+Δ),   [X1+Δ, X1+X2),    [X1+X2, X1+X2+Δ),     [X1+X2+Δ,1]

X(k1) 在区间[X1, X1+Δ), X(k1+k2) 在区间[X1+X2, X1+X2+Δ)。 我们另X3 = 1-X1-X2.

则,

                            

即Dir(x1, x2, x3| k1, k2, n-k1-k2+1)

问题2: (1) X1, X2......Xn 服从Uniform(0,1), 排序后的顺序统计量为X(1), X(2), X(3)......X(n)

    (2) 令p1 = [0, X(k1)], p2 = [X(k1), X(k1+k2)], p3 = 1-p1-p2 

    (3) 另外给出新的信息, Y1, Y2.....Ym服从Uniform(0, 1), Yi落到[0,X(k1)],  [X(k1), X(k1+k2)], [X(k1+k2), 1]的数目分别是m1, m2, m3

           (4) 问后验概率 p(p1,p2,p3|Y1,Y2,....Ym)的分布。

其实这个问题和问题1很像,只是在同样的范围内多了一些点而已。 因此这个概率分布为 Dir(x1,x2,x3| k1+m1, k2+m2, n-k1-k2+1+m3)。

我们发现这么一个规律     Dir(p|k) + multCount(m) = Dir(p|k+m)。 即狄利克雷分布是多项分布的共轭分布。

狄利克雷分布有这么一个性质:如果则,

                                               

 

3、 LDA文本建模

 首先我们想一篇文章是如何形成的:作者在写一篇文章的时候首先会想这个文章需要包含什么主题呢。比如在写武侠小说的时候,首先会想小说里边需要包含武侠、爱情、亲情、搞笑四个主题。并且给这四个主题分配一定的比例(如武侠0.4,爱情0.3,亲情0.2,搞笑0.1)。每个主题会包含一些word,不同word的概率也是不一样的。 因此我们上帝在生成一篇文章的时候流程是这个样子的:

(1)上帝有两个坛子的骰子,第一个坛子装的是doc-topic骰子,第二个坛子装的是topic-wod骰子。

(2)上帝随机的从二个坛子中独立抽取了k个topic-doc骰子,编号1-K。

(3)每次生成一篇新的文档前,上帝先从第一个坛子中随机抽取一个doc-topic骰子,然后重复如下过程生成文档中的词。

        <1>、投掷这个doc-topic骰子,得到一个topic的编号z。

        <2>、选择K个topic-word骰子中编号为z的的那个,投掷这个骰子, 于是就得到了这个词。

假设语料库中有M篇文章, 所有的word和对应的topic如下表示:

                                                             

我们可以用下图来解释这个过程:  

                                          

一共两个物理过程:

第一个过程: ,这个过程分两个阶段。第一个阶段是上帝在生成一篇文档之前,先抽出一个主题分布的骰子,这个分布选择了狄利克雷分布(狄利克雷分布是多项分布的共轭分布)。 第二个阶段根据来抽样得到每个单词的topic。这是一个多项分布。 整个过程是符合狄利克雷分布的。

第二个过程:,这个过程也分两个阶段。第一个阶段是对每个主题,生成word对应的概率,即选取的骰子,这个分布也是选择了狄利克雷分布。 第二个阶段是根据,对于确定的主题选择对应的word,这是一个多项分布。因此,整个过程是狄利克雷分布。

 

4、吉普斯抽样概率公式推导

LDA的全概率公式为: 。 由于是观测到的已知数据,只有是隐含的变量,所以我们需要关注的分布为:。 我们利用Gibbs Sampling进行抽样。 我们要求的某个位置i(m,n)对应的条件分布为 

                                                  

                                                                      是一个定值,因此原公式成立。

下边是公式的推导:

                              

又由于根据狄利克雷分布的特性:

                               

 

抽样的时候,首先随机给每个单词一个主题,然后用进行Gibbs抽样,抽样后更新这两个值,一直迭代到收敛(EM过程)。

至此抽样就结束了。

 

 

5、使用LDA

抽样结束后,我们可以统计来得到

对于LDA我们的目标有两个:

  (1)得到文章库中每篇文章的主题分布

      (2)对于一篇新来的文章,能得到它的主题分布

第一个目标很容易就能达到。下面主要介绍如果计算 一篇新文章的主题分布。这里我们假设是不会变化的。因此对于一篇新文章到来之后,我们直接用Gibbs Sampling得到新文章的就好了。 具体抽样过程同上。

由于工程上对于计算新的文章没有作用,因此往往只会保存

### LDA主题建模简介 LDA(Latent Dirichlet Allocation)是一种无监督学习算法,用于从文档集合中提取隐藏的主题结构。它假设每篇文档是由多个主题组成,而每个主题又由一组词的概率分布定义[^1]。 以下是关于LDA主题建模的教程、代码实现以及工具推荐的内容: --- ### 教程概述 #### 主题建模概念 主题建模旨在通过统计方法挖掘大量文本数据中的潜在语义模式。LDA作为最常用的主题建模技术之一,能够帮助研究者理解大规模文本数据的核心内容[^1]。 #### 数据预处理流程 在构建LDA模型之前,通常需要完成以下步骤: - **分词**:将原始文本拆分为单词序列。 - **去停用词**:移除常见的无关紧要词语(如“the”, “is”等)。 - **词形还原/词干化**:统一不同形式的同一词汇(如“running” -> “run”)。 - **向量化**:将文本转换为数值表示形式,例如TF-IDF矩阵或词袋模型。 这些操作可以通过`nltk`、`spaCy`或其他自然语言处理库来实现[^2]。 --- ### Python代码实现 下面是一个完整的LDA主题建模示例,使用Gensim库完成: ```python import gensim from gensim.utils import simple_preprocess from gensim.parsing.preprocessing import STOPWORDS from nltk.stem import WordNetLemmatizer, SnowballStemmer import numpy as np # 文本预处理函数 def preprocess(text): result = [] stemmer = SnowballStemmer('english') for token in simple_preprocess(text): if token not in STOPWORDS and len(token) > 3: result.append(stemmer.stem(WordNetLemmatizer().lemmatize(token, pos='v'))) return result # 假设有一个文档列表 `data` data = ["The sky is blue.", "The sun is bright."] processed_data = [preprocess(doc) for doc in data] # 创建字典和语料库 dictionary = gensim.corpora.Dictionary(processed_data) corpus = [dictionary.doc2bow(text) for text in processed_data] # 训练LDA模型 lda_model = gensim.models.LdaModel( corpus, num_topics=5, # 设置主题数 id2word=dictionary, passes=30 # 迭代次数 ) # 输出主题及其关键词 topics = lda_model.print_topics(num_words=10) for idx, topic in topics: print(f"Topic {idx}: {topic}") ``` 此代码展示了如何利用Gensim库训练一个简单的LDA模型,并打印出各个主题的主要关键词[^2]。 --- ### 工具推荐 除了Gensim外,还有其他一些流行的工具可以用来进行LDA主题建模: 1. **Scikit-Learn**: 提供了一个简单易用的接口来进行主题建模。其`LatentDirichletAllocation`类支持快速原型设计。 ```python from sklearn.decomposition import LatentDirichletAllocation lda_sklearn = LatentDirichletAllocation(n_components=5, max_iter=10) lda_output = lda_sklearn.fit_transform(tfidf_matrix) ``` 2. **pyLDAvis**: 是一种专门用于可视化的工具,可以帮助直观展示LDA模型的结果。它可以生成交互式的图表以便更好地解释主题之间的关系[^1]。 ```python import pyLDAvis.gensim_models as gensimvis vis = gensimvis.prepare(lda_model, corpus, dictionary) pyLDAvis.display(vis) ``` 3. **Mallet**: 虽然不是一个纯Python工具,但它以其高效性和高质量的主题推断能力著称。可通过调用Java API集成到Python项目中。 --- ### 总结 LDA主题建模是一项强大的数据分析技术,在探索性文本挖掘领域具有广泛应用价值。无论是理论基础还是实际应用层面,掌握该技能都将极大提升对复杂文本数据的理解力。上述提供的代码片段与工具介绍应能满足初学者的学习需求并为进一步深入研究奠定坚实的基础[^1][^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值