找回密码
 注册
查看: 13629|回复: 8

文本挖掘 语义主题计算 主题模型是什么

[复制链接]
发表于 2013-4-29 11:03:55 | 显示全部楼层 |阅读模式
摘要:

两篇文档是否相关往往不只决定于字面上的词语重复,还取决于文字背后的语义关联。对语义关联的挖掘,可以让我们的搜索更加智能化。本文着重介绍了一个语义挖掘的利器:主题模型。主题模型是对文字隐含主题进行建模的方法。它克服了传统信息检索中文档相似度计算方法的缺点,并且能够在海量互联网数据中自动寻找出文字间的语义主题。近些年来各大互联网公司都开始了这方面的探索和尝试。就让我们看一下究竟吧。

关键词:主题模型

技术领域:搜索技术、自然语言处理


假设有两个句子,我们想知道它们之间是否相关联:

第一个是:“乔布斯离我们而去了。”

第二个是:“苹果价格会不会降?”

如果由人来判断,我们一看就知道,这两个句子之间虽然没有任何公共词语,但仍然是很相关的。这是因为,虽然第二句中的“苹果”可能是指吃的苹果,但是由于第一句里面有了“乔布斯”,我们会很自然的把“苹果”理解为苹果公司的产品。事实上,这种文字语句之间的相关性、相似性问题,在搜索引擎算法中经常遇到。例如,一个用户输入了一个query,我们要从海量的网页库中找出和它最相关的结果。这里就涉及到如何衡量query和网页之间相似度的问题。对于这类问题,人是可以通过上下文语境来判断的。但是,机器可以么?

在传统信息检索领域里,实际上已经有了很多衡量文档相似性的方法,比如经典的VSM模型。然而这些方法往往基于一个基本假设:文档之间重复的词语越多越可能相似。这一点在实际中并不尽然。很多时候相关程度取决于背后的语义联系,而非表面的词语重复。

那么,这种语义关系应该怎样度量呢?事实上在自然语言处理领域里已经有了很多从词、词组、句子、篇章角度进行衡量的方法。本文要介绍的是其中一个语义挖掘的利器:主题模型。

主题模型是什么?

主题模型,顾名思义,就是对文字中隐含主题的一种建模方法。还是上面的例子,“苹果”这个词的背后既包含是苹果公司这样一个主题,也包括了水果的主题。当我们和第一句进行比较时,苹果公司这个主题就和“乔布斯”所代表的主题匹配上了,因而我们认为它们是相关的。

在这里,我们先定义一下主题究竟是什么。主题就是一个概念、一个方面。它表现为一系列相关的词语。比如一个文章如果涉及到“百度”这个主题,那么“中文搜索”、“李彦宏”等词语就会以较高的频率出现,而如果涉及到“IBM”这个主题,那么“笔记本”等就会出现的很频繁。如果用数学来描述一下的话,主题就是词汇表上词语的条件概率分布 。与主题关系越密切的词语,它的条件概率越大,反之则越小。

例如:
_11322018984.jpg


通俗来说,一个主题就好像一个“桶”,它装了若干出现概率较高的词语。这些词语和这个主题有很强的相关性,或者说,正是这些词语共同定义了这个主题。对于一段话来说,有些词语可以出自这个“桶”,有些可能来自那个“桶”,一段文本往往是若干个主题的杂合体。我们举个简单的例子,见下图。
_11322018984.jpg


以上是从互联网新闻中摘抄下来的一段话。我们划分了4个桶(主题),百度(红色),微软(紫色)、谷歌(蓝色)和市场(绿色)。段落中所包含的每个主题的词语用颜色标识出来了。从颜色分布上我们就可以看出,文字的大意是在讲百度和市场发展。在这里面,谷歌、微软这两个主题也出现了,但不是主要语义。值得注意的是,像“搜索引擎”这样的词语,在百度、微软、谷歌这三个主题上都是很可能出现的,可以认为一个词语放进了多个“桶”。当它在文字中出现的时候,这三个主题均有一定程度的体现。

有了主题的概念,我们不禁要问,究竟如何得到这些主题呢?对文章中的主题又是如何进行分析呢?这正是主题模型要解决的问题。下面我简要介绍一下主题模型是怎样工作的。

主题模型的工作原理

首先,我们用生成模型的视角来看文档和主题这两件事。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到的。那么,如果我们要生成一篇文档,它里面的每个词语出现的概率为:

_11322018984.jpg

上面这个式子,可以矩阵乘法来表示,如下图所示:

_11322018984.jpg

左边的C矩阵表示每篇文章中每次词语出现的概率;中间的Φ矩阵表示的是每个主题中每个词语出现的概率 ,也就是每个“桶

表示的是每篇文档中各个主题出现的概率 ,可以理解为一段话中每个主题所占的比例。

假如我们有很多的文档,比如大量的网页,我们先对所有文档进行分词,得到一个词汇列表。这样每篇文档就可以表示为一个词语的集合。对于每个词语,我们可以用它在文档中出现的次数除以文档中词语的数目作为它在文档中出现的概率 。这样,对任意一篇文档,左边的C矩阵是已知的,右边的两个矩阵未知。而主题模型就是用大量已知的“词语-文档”C矩阵 ,通过一系列的训练,推理出右边的“词语-主题”矩阵Φ 和“主题文档”矩阵Θ 。


主题模型训练推理的方法主要有两种,一个是pLSA(Probabilistic Latent Semantic Analysis),另一个是LDA(Latent Dirichlet Allocation)。pLSA主要使用的是EM(期望最大化)算法;LDA采用的是Gibbs sampling方法。由于它们都较为复杂且篇幅有限,这里就只简要地介绍一下pLSA的思想,其他具体方法和公式,读者可以查阅相关资料。

pLSA采用的方法叫做EM(期望最大化)算法,它包含两个不断迭代的过程:E(期望)过程和M(最大化)过程。用一个形象的例子来说吧:比如说食堂的大师傅炒了一盘菜,要等分成两份给两个人吃,显然没有必要拿天平去一点点去精确称量,最简单的办法是先随意的把菜分到两个碗中,然后观察是否一样多,把比较多的那一份取出一点放到另一个碗中,这个过程一直重复下去,直到大家看不出两个碗里的菜有什么差别为止。

对于主题模型训练来说,“计算每个主题里的词语分布”和“计算训练文档中的主题分布”就好比是在往两个人碗里分饭。在E过程中,我们通过贝叶斯公式可以由“词语-主题”矩阵计算出“主题-文档”矩阵。在M过程中,我们再用“主题-文档”矩阵重新计算“词语-主题”矩阵。这个过程一直这样迭代下去。EM算法的神奇之处就在于它可以保证这个迭代过程是收敛的。也就是说,我们在反复迭代之后,就一定可以得到趋向于真实值的 Φ和 Θ。

如何使用主题模型?

有了主题模型,我们该怎么使用它呢?它有什么优点呢?我总结了以下几点:

1)  它可以衡量文档之间的语义相似性。对于一篇文档,我们求出来的主题分布可以看作是对它的一个抽象表示。对于概率分布,我们可以通过一些距离公式(比如KL距离)来计算出两篇文档的语义距离,从而得到它们之间的相似度。

2)它可以解决多义词的问题。回想最开始的例子,“苹果”可能是水果,也可能指苹果公司。通过我们求出来的“词语-主题”概率分布,我们就可以知道“苹果”都属于哪些主题,就可以通过主题的匹配来计算它与其他文字之间的相似度。
3) 它可以排除文档中噪音的影响。一般来说,文档中的噪音往往处于次要主题中,我们可以把它们忽略掉,只保持文档中最主要的主题。
4) 它是无监督的,完全自动化的。我们只需要提供训练文档,它就可以自动训练出各种概率,无需任何人工标注过程。
5) 它是跟语言无关的。任何语言只要能够对它进行分词,就可以进行训练,得到它的主题分布。
综上所述,主题模型是一个能够挖掘语言背后隐含信息的利器。近些年来各大搜索引擎公司都已经开始重视这方面的研发工作。语义分析的技术正在逐步深入到搜索领域的各个产品中去。在不久的将来,我们的搜索将会变得更加智能,让我们拭目以待吧。

选自:http://stblog.baidu-tech.com/?p=1190
回复

使用道具 举报

 楼主| 发表于 2013-4-29 12:47:10 | 显示全部楼层
2 R语言实现主题模型

通过上面简介,我们了解了主题模型是什么。这样心里就大体知道主题模型都能用来做什么工作。
下面我们通过一些小的例子,通过R语言来实现主题模型的计算过程。 深入的学习还需自行挖掘。此处仅作一例子示范,让大家能够实践此过程,方便学习。

重要的不是结果,而是整个过程。


install.packages("corpus.JSS.papers",
                   repos = "http://datacube.wu.ac.at/",
                   type = "source")


data("JSS_papers", package = "corpus.JSS.papers");

require("OAIHarvester")
x <- oaih_list_records("http://www.jstatsoft.org/oai")
JSS_papers <- oaih_transform(x[, "metadata"])
JSS_papers <- JSS_papers[order(as.Date(unlist(JSS_papers[, "date"]))), ]
JSS_papers <- JSS_papers[grep("Abstract:", JSS_papers[, "description"]), ]
JSS_papers[, "description"] <- sub(".*\nAbstract:\n", "",unlist(JSS_papers[, "description"]))



set.seed(1102)
#library("topicmodels")
library("XML")
library(Snowball)
library(tm)

remove_HTML_markup <-function(s) {
        doc <- htmlTreeParse(s, asText = TRUE, trim = FALSE)
        iconv(xmlValue(xmlRoot(doc)), "", "UTF-8")
        }

corpus <- Corpus(VectorSource(sapply(JSS_papers[, "description"],remove_HTML_markup)))


JSS_dtm <- DocumentTermMatrix(corpus,
        control = list(stemming = TRUE, stopwords = TRUE, minWordLength = 3,
        removeNumbers = TRUE))


dim(JSS_dtm)
library("slam")
term_tfidf <-
  tapply(JSS_dtm$v/row_sums(JSS_dtm)[JSS_dtm$i],
         JSS_dtm$j, mean) *
    log2(nDocs(JSS_dtm)/col_sums(JSS_dtm > 0))
summary(term_tfidf)
JSS_dtm <- JSS_dtm[,term_tfidf >= 0.1]
JSS_dtm <- JSS_dtm[row_sums(JSS_dtm) > 0,]
dim(JSS_dtm)



################################################
## 主题模型
################################################
library("topicmodels")
k <- 30
jss_TM <- LDA(JSS_dtm, k = k,
              control = list(seed = 2010))
Topic <- topics(jss_TM, 1)
table(Topic)
Terms <- terms(jss_TM, 5)
Terms[,1:4]
11.jpg

## Volume 24: Special Issue ``Statistical Modeling of
## Social Networks with `statnet'''
p_v24 <- grep("/v24/", JSS_papers[, "identifier"])
avg <- colMeans(posterior(jss_TM)$topics[p_v24,])
topics_v24 <- which.max(avg)
most_frequent_v24 <- which.max(tabulate(topics_v24))
terms(jss_TM, 10)[, most_frequent_v24]
22.jpg

对于主题模型的深入研究,大家可以参考下面
http://www.stat.uni-muenchen.de/ ... fcim-beispiele-09.R
Topic Models in R.pdf (168.84 KB, 下载次数: 78)

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-29 14:08:19 | 显示全部楼层
3  LDA主题模型

在第一部分介绍了什么是主题模型,主题模型训练推理的方法主要有两种,一个是pLSA(Probabilistic Latent Semantic Analysis),另一个是LDA(Latent Dirichlet Allocation)。

第二部分简单做了一下主题模型的例子。其中用到了LDA主题模型训练推理方法。

本部分简介一下什么是LDA。


LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。由于 Dirichlet分布随机向量各分量间的弱相关性(之所以还有点“相关”,是因为各分量之和必须为1),使得我们假想的潜在主题之间也几乎是不相关的,这与很多实际问题并不相符,从而造成了LDA的又一个遗留问题。

对于语料库中的每篇文档,LDA定义了如下生成过程(generative process):

1. 对每一篇文档,从主题分布中抽取一个主题;

2. 从上述被抽到的主题所对应的单词分布中抽取一个单词;

3. 重复上述过程直至遍历文档中的每一个单词。

更形式化一点说,语料库中的每一篇文档与 T(通过反复试验等方法事先给定)个主题的一个多项分布相对应,将该多项分布记为 θ。每个主题又与词汇表(vocabulary)中的  V个单词的一个多项分布相对应,将这个多项分布记为 &#981;。上述词汇表是由语料库中所有文档中的所有互异单词组成,但实际建模的时候要剔除一些停用词(stopword),还要进行一些词干化(stemming)处理等。θ 和&#981;分别有一个带有超参数(hyperparameter)α和β的Dirichlet先验分布。对于一篇文档d中的每一个单词,我们从该文档所对应的多项分布θ中抽取一个主题z,然后我们再从主题z所对应的多项分布&#981;中抽取一个单词w。将这个过程重复Nd次,就产生了文档d,这里的Nd是文档d的单词总数。这个生成过程可以用如下的图模型表示:

LDA.png

这个图模型表示法也称作“盘子表示法”(plate notation)。图中的阴影圆圈表示可观测变量(observed variable),非阴影圆圈表示潜在变量(latent variable),箭头表示两变量间的条件依赖性(conditional dependency),方框表示重复抽样,重复次数在方框的右下角。

该模型有两个参数需要推断(infer):一个是“文档-主题”分布θ,另外是T个“主题-单词”分布&#981;。通过学习(learn)这两个参数,我们可以知道文档作者感兴趣的主题,以及每篇文档所涵盖的主题比例等。推断方法主要有LDA模型作者提出的变分-EM算法,还有现在常用的Gibbs抽样法。

LDA模型现在已经成为了主题建模中的一个标准。如前所述,LDA模型自从诞生之后有了蓬勃的扩展,特别是在社会网络和社会媒体研究领域最为常见。

参考http://cos.name/2010/10/lda_topic_model/




David Blei 博士论文:
Probabilistic Models of Text and Images" . PhD thesis, U.C. Berkeley, Division of Computer Science, 2004.
下载:http://www.cs.princeton.edu/~blei/papers/Blei2004.pdf


David Blei与Jordan的关于LDA的论文:
Blei, David M.; Ng, Andrew Y.; Jordan, Michael I; "Latent Dirichlet allocation". Journal of Machine Learning Research
下载:http://www.cs.princeton.edu/~blei/papers/BleiNgJordan2003.pdf

其它人对LDA的讨论:
一个卡内基梅隆大学关于LDA的PPT http://www.cs.cmu.edu/~jch1/research/presentation/LDAUnrolled.ppt

丕子 上对于LDA的讨论,讲得较为清楚,对于不习惯英文的这个就很不错: http://www.shamoxia.com/html/y2010/1384.html


网上还有一篇对于LDA的中文note, 从基础开始讲,对于没有很好统计基础的人很适合:http://lsa-lda.googlecode.com/fi ... location%20note.pdf

回复 支持 反对

使用道具 举报

发表于 2013-6-19 17:24:25 | 显示全部楼层
谢谢,认真学习!
回复 支持 反对

使用道具 举报

发表于 2013-12-8 22:19:13 | 显示全部楼层
慢慢学习中,好东东,要顶!
回复 支持 反对

使用道具 举报

发表于 2013-12-10 10:01:26 | 显示全部楼层
楼主好伟大,我找了好久,终于找到了
回复 支持 反对

使用道具 举报

发表于 2013-12-17 20:46:56 | 显示全部楼层
写的很好,但是有些看不太懂啊,比如JSS_dtm开面的 i  j   v   都是表示什么意思呢?
回复 支持 反对

使用道具 举报

发表于 2015-6-3 10:48:23 | 显示全部楼层
biostatistic 发表于 2013-4-29 12:47
2 R语言实现主题模型

通过上面简介,我们了解了主题模型是什么。这样心里就大体知道主题模型都能用来做 ...

很好的资料,谢谢啦
回复 支持 反对

使用道具 举报

发表于 2015-10-20 17:20:08 | 显示全部楼层
使用在哪方面比较好?
文本分类?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 19:46 , Processed in 0.049653 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表