用LDA处理文本(Python)
来源:互联网 发布:javascript json类型 编辑:程序博客网 时间:2024/06/06 02:05
一、LDA介绍
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
1、LDA生成过程
对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess):(1)对每一篇文档,从主题分布中抽取一个主题;
(2)从上述被抽到的主题所对应的单词分布中抽取一个单词;
(3)重复上述过程直至遍历文档中的每一个单词。
语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。
2、LDA整体流程
文档集合D,主题集合TD中每个文档d看作一个单词序列<w1, w2, …… ,wn>,wi表示第i个单词,设d有n个单词。(LDA里面称之为wordbag,实际上每个单词的出现位置对LDA算法无影响)
文档集合D中的所有单词组成一个大集合VOCABULARY(简称VOC)。
LDA以文档集合D作为输入,希望训练出两个结果向量(设聚成k个topic,VOC中共包含m个词)。
对每个D中的文档d,对应到不同Topic的概率θd<pt1,...,ptk>,其中,pti表示d对应T中第i个topic的概率。计算方法是直观的,pti=nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。
对每个T中的topic,生成不同单词的概率φt<pw1,...,pwm>,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topict的VOC中第i个单词的数目,N表示所有对应到topict的单词总数。
LDA的核心公式如下:
p(w|d)=p(w|t)*p(t|d)
直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。
实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响θd和φt。
二、Python示例实现
1、获取训练矩阵和单词
import numpy as npimport ldaX = np.genfromtxt("data\\source_wzp_lda_1.txt", skip_header=1, dtype = np.int)#the vocabfile_vocab = open("data\\vectoritems_lda_3.txt", "r")vocab = (file_vocab.read().decode("utf-8").split("\n"))[0:-1]print len(vocab)X是一个n*m的矩阵,表示有n个文本,m个单词,值表示出现次数或者是否出现。
vocab是m个单词组成的list。
2、训练数据,指定主题,进行迭代
#指定11个主题,500次迭代model = lda.LDA(random_state=1, n_topics=11, n_iter=1000)model.fit(X)3、主题-单词(topic-word)分布
#主题-单词(topic-word)分布topic_word = model.topic_word_print("type(topic_word): {}".format(type(topic_word)))print("shape: {}".format(topic_word.shape))#获取每个topic下权重最高的10个单词n = 10for i, topic_dist in enumerate(topic_word): topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n+1):-1] print("topic {}\n- {}".format(i, ('-'.join(topic_words)).encode("utf-8")))
4、文档-主题(Document-Topic)分布
#文档主题(Document-Topic)分布:doc_topic = model.doc_topic_print("type(doc_topic): {}".format(type(doc_topic)))print("shape: {}".format(doc_topic.shape))#一篇文章对应一行,每行的和为1#输入前10篇文章最可能的Topicfor n in range(20): ''' for i in doc_topic[n]: print i ''' topic_most_pr = doc_topic[n].argmax() print("doc: {} topic: {}".format(n, topic_most_pr))
- 用LDA处理文本(Python)
- 在Python中使用LDA处理文本
- python自然语言处理之lda
- 用 Python 实现 LDA
- Spark下实现LDA+SVM的文本分类处理
- Python 中的文本处理
- python中的文本处理
- python文本处理
- python文本处理
- python文本处理总结
- Python - 文本处理模块
- Python中的文本处理
- Python 文本处理
- Python中的文本处理
- python文本处理
- python文本处理
- python 文本处理
- 文本处理(python)
- Bootstrap Checks 抽样检查:
- 【0015】navicat中把excel导入表
- [v9] v9站群模式下,子站点栏目和文章ur动态时l域名错误显示为主站链接的解决办法
- shiro之roles实现or关系的角色过滤
- jquery中attr和prop的区别
- 用LDA处理文本(Python)
- Leftmost Digit
- float double精度和取值范围
- App 优化(三)未完成
- java多线程之并行和并发
- sublime安装svn提交
- ztree随笔
- SqlServer2012清除日志文件
- 手机采用L形主板(譬如iPhone)比长方形主板的优点