用gensim做LDA实践之文本分类

之前看LDA,一直没搞懂到底作用是什么,公式推导了一大堆,dirichlet分布求了一堆倒数,却没有真正理解精髓在哪里。

最近手上遇到了一个文本分类的问题,采用普通的VSM模型的时候,运行的太慢,后来查找改进策略的时候,想起了LDA,因此把LDA重新拉回我的视线,也终于弄懂了到底是做什么的。

LDA本质是一种降维

为什么这么说,因为在我的文本分类问题中,文本共有290w个,根据词项得到的维度为90w个,这样一个巨大的矩阵【尤其是维度过多】扔到分类器里,肯定会有各种各样的问题【比如训练过慢,过拟合,等等】
因此,LDA的出现,能让VSM模型的列,由词项变成“主题”。这也就是主题模型的来历吧。

文档——主题矩阵

先看一个简单的:LSI 隐语意索引。基本方法是SVD矩阵分解
从图片中可以看到,最开始文档——词矩阵,被分解为两个矩阵的相乘,其中主题的个数【维度】要远远小于词的维度

现在我们开始分析这两个矩阵各自长啥样:
文档——主题矩阵求出来之后,是这样的
这里写图片描述
在这里,我定义了200个主题,现只截图了前25个主题。

需要说明的是,这个是第一个文档的主题分布。我们可以看到,第一个样本的第6,第7个主题明显

LDA(Latent Dirichlet Allocation)是一种经典的主题模型,通常用于文本数据的建模与分析,其中每个主题由一组词语组成。推荐系统中也可以使用LDA对用户历史行为进行建模,从而更好地理解用户的兴趣偏好和行为习惯。关于LDA的详细介绍可以参考文献《Latent Dirichlet Allocation》。 LDA的代码实现有很多,下面简单介绍一下Python中gensim库实现LDA的方法,gensim是一个专门用于主题模型和自然语言处理的Python库,支持多种主题模型算法,包括LDA。 以下是LDA代码的完整版: ```python # 导入gensim库和其他必要的库 import gensim from gensim import corpora, models import numpy as np # 定义语料库和字典 corpus = [[(1, 0.5), (2, 0.2)], [(2, 0.3), (3, 0.5)], [(1, 0.1), (3, 0.4), (4, 0.3)]] dictionary = corpora.Dictionary(corpus) # 定义LDA模型并训练 lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=2) lda_model.print_topics() # 使用模型进行推断 doc_lda = lda_model[corpus] for i in range(len(corpus)): print("文档{}的主题分布为:".format(i)) print(doc_lda[i]) # 获取每个文档中主题的分布情况 doc_topic_dist = np.array([[tup for tup in lst] for lst in doc_lda]) # 打印每个文档的主题分布情况 print("每个文档的主题分布情况为:") print(doc_topic_dist) ``` 在上面的代码中,我们首先定义了一个语料库corpus和一个字典dictionary,然后使用这两个变量来训练LDA模型,并输出每个主题中包含的词语。接着我们使用训练好的模型对语料库进行推断,得到每个文档的主题分布情况,并将这些分布情况保存在一个二维数组doc_topic_dist中。最后,我们打印出每个文档的主题分布情况。 如果你想进一步了解LDA在推荐系统中的应用,可以参考文献《Collaborative Topic Modeling for Recommending Scientific Articles》。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值