Archive for June 2011

用GibbsLDA做Topic Modeling

Topic Modeling是一种文本挖掘的方法。将文本视作一个由许多许多词组成的数据库,就能通过分析哪些词经常在一起出现,哪些词出现的多,等等手段来探测文本中隐含的主题。比如,有一万篇文章,人工对这些文章进行分类,提取主题是十分浩大的工程。但是如果能用计算机来实现的话,对于社会科学研究者,尤其是注重对文本分析的传播学者来说,是个非常值得应用的工具。

简单来说,Topic Modeling就是干这么个活。把一堆文字放进去,你告诉计算机,你要多少个主题(比如,5),每个主题包含多少个字(比如,10),然后让计算机跑跑跑,过一会儿,计算机就告诉你5个主题,每个主题10个字分别是什么。

听起来有点玄乎,但是如果你能明白传统的因子分析(Factor Analysis),基本上就能明白Topic Modeling。核心思想无非就是降维度。对于因子分析来说,可以从100个变量,降维提出5个因子。对于Topic Modeling来说,可以通过100篇文章(可能包含100,000个字/词),降维提出5个主题。

具体到对Topic Modeling的操作,那就千变万化了。计算机科学(Computer Science)领域专门有人做这个,发展出各种算法。

我只介绍一种,叫做GibbsLDA。这其实就是Gibbs Sampling(一种抽样方法)跟Latent Dirichlet Allocation (LDA,一种算法/模型)的结合。这玩意儿太深奥了。我也解释不清楚。反正如果你google的话,有人用这两种东西的结合GibbsLDA写了文章,发了,貌似影响不小。是可行的,靠谱的。LDA最早是由David Blei提出的。

D. Blei, A. Ng, and M. Jordan: Latent Dirichlet Allocation, Journal of Machine Learning Research (2003).

更多的文章可以看看这里。也可以google下列文章:

l Finding scientific topics.

l The author-topic model for authors and documents.

l Bibliometric Impact Measures Leveraging Topic Analysis.

l Detecting Topic Evolution in Scientific Literature: How CanCitations Help?

这个GibbsLDA有很多的软件版本,比如C++版,Java版,Python版,MatLab版。各种版本对输入数据的要求可能还不一样。就我使用的情况来看,C++版本最稳定,运算速度也最快。

但是呢,C++版本一般在Linux上运行,如在Windows下运行,还得按照个Visual Studio。工程浩大。

Windows上装个Linux其实不难,搞个Wubi,在C盘上分出一个空间(10G左右),傻瓜都能搞定。这个Wubi给装的Linux是Ubuntu版本。不难用。Wubi其实是给你的电脑上傻瓜式地装上了一个虚拟Linux系统。开机时会让你选进Linux还是Windows。进了Linux也不怕,搞个天翻地覆,也就在你分给它的那点硬盘(比如10G)里,坏不了大事。当然,你舍不得搞复杂你的Windows的话,可以想办法搞个Linux的机器来玩玩。

累死了。简单来说,怎么安装使用GibbsLDA++看这里就可以了。不过我还是多罗嗦几句吧。

好了,从现在开始,就进入到安装GibbsLDA++了。

第一步:下载GibbsLDA++

第二步:把下载的文件放到一个文件夹。对于没接触过Linux的同学来说,你可以放到,,,比如说/home/user(你的用户名)/LDA/ 下面。对于在Windows上用虚拟Ubuntu的同学来说,在你找的地方,随便造个文件夹装下这文件就好了。

第三步:解压缩及安装。对于没用过Linux的同学来说,没有右键解压缩这个故事是很痛苦的。好吧,慢慢来。比如你这个狗屁文件放到了/home/user/LDA/下面。而你甚至连你在什么文件夹下都不知道。你可以这样。在Terminal(也就是一个黑屏幕,只能输入命令的那种)里面输入(下面的$表示一行命令的开始,不用输入)

$ cd /home/user/LDA/

就行了。然后,解压缩。输入

$ gunzip GibbsLDA++-0.2.tar.gz(这个gunzip后面是你刚下载的文件的文件名,我下的是GibbsLDA++-0.2)

$ tar -xf GibbsLDA++-0.2.tar

然后进到你刚解压出来的那个文件夹(假设你现在还是在/home/user/LDA/下面)。输入

$ cd \GibbsLDA++-0.2

现在,你已经在/home/user/LDA/GibbsLDA++-0.2/ 这个文件夹下面了已然后安装GibsLDA。输入

$ make clean

$ make all

到目前为止,你已经大功告成了。安装完成。

第四步:准备你要让计算机去做Topic Modeling的文件。在C++的环境里,Topic Modeling需要这样的一个文件。文件格式是dat。这是最原始的txt文件。你也可以用任何软件存成txt文件之后,直接把后缀改成dat就行。比如,你的文件包含1,000篇文章。那你的文件就是这样的

第1行是你总共的文章篇数,在我们的例子里面是1000

第2行到第1001行就是你的那些文章,每篇文章占一行。对于英文来说,每个词之间已经用空格分开了,但是中文不行,所以你要先对文章进行切词。切词这事儿,就不归我这篇小臭长文管了。

第五步:运行GibbsLDA++,得到你要的结果。

将你要跑的文件,比如就叫test.dat吧。将文件放到/home/user/LDA/ 下面,也就是/home/user/LDA/test.dat

然后进入到你装了GibbsLDA++的文件夹,也就是/home/user/LDA/GibbsLDA++-0.2/,然后运行指令。其实就是在Terminal里面输入

$ cd /home/user/LDA/GibbsLDA++-0.2/

$ lda -est [-alpha <double>] [-beta <double>] [-ntopics <int>] [-niters <int>] [-savestep <int>] [-twords <int>] -dfile <string>

这句话“$ lda -est [-alpha <double>] [-beta <double>] [-ntopics <int>] [-niters <int>] [-savestep <int>] [-twords <int>] -dfile <string>”里面其实是GibbsLDA进行估算的各种参数设计,你实际输入的指令可能是:

$ src/lda -est -alpha 0.5 -beta 0.1 -ntopics 100 -niters 1000 -savestep 100 -twords 20 -dfile /home/luheng/LDA/test.dat

这意思是,参数alpha是0.5(这个可以先不管),参数beta是0.1(这个也可以先不管),产生100个topic,运算迭代1000次,每迭代100次之后的结果都保存出来,每个topic包含20个词,要运算的文件是/home/luheng/LDA/test.dat

第六步:看结果。

好了,如果你顺利走到这一步,就去看结果吧。结果文件存在你的测试文件所在的目录。在这个案例中,就是/home/luheng/LDA/ 下面。

会产生类似这样的文件,不同的后缀表示不同的结果。所有这些文件都可以用记事本打开。newdocs.dat.others
newdocs.dat.phi
newdocs.dat.tassign
newdocs.dat.theta
newdocs.dat.twords

其中最直接的是.twords文件。这个文件里面就是你要的n个topic,以及每个topic下面包含的具体的字词。

.others里面是各种你设置的参数

.theta里面是每篇文章对应你设置的n个topic的“因子载荷”(factor loading)

.phi里面是每个topic对应每篇文章的“因子载荷”(factor loading)

.theta 和 .phi 里面的数据其实是一回事,互为转置罢(transpose)了。

.tassign是个啥玩意儿我暂时还没去搞明白。反正除此以外的那几个文件里面的东西已经够我用了。

一些提醒:

计算机很聪明也很笨,你给什么它都帮你算,所以你准备的文件一定要想清楚。比如,是不是所有字词都放心去,那些a, the, of啊,那些华丽丽的形容词啊,是拿掉还是放心去。或者是不是只放名词进去。这事儿只能自己决定,计算机帮不了你。

你选多少个主题,每个主题要多少字,迭代多少步。这玩意儿没有一定的规定。你就试吧。撞大运吧。虽然GibbsLDA靠谱,可终究还是跟因子分析一样,充满了arbitrary!

Reflections on the Wyer’s Course

(狗屁不通,慎入)

课程内容

Wyer所讲授的这门课教Consumer Psychology。诚如Wyer自己所说,他对消费者行为及市场营销的研究大部分基于来自心理学的理论。本学期的课程主要覆盖了四个部分:

1. Accessibility of knowledge in memory

2. Social influences on comprehension and communication

3. Learning and Memory: Information acquisition

4. Inference and evaluation processes

第一个部分讲人们大脑中的知识是如何被激活的,印象最深的是讲priming,各种验证priming的实验案例。

第二部分讲人们怎样理解信息,这部分涉及的the role of conversational norms in the comprehension of product information十分像传播学里面所涉及的内容,比如信源的可信度对信息解读的影响。这部分还有一个令我印象比较深刻的,是讲visual和verbal的信息是如何(不同地)影响人们对产品信息的理解和判断的。

第三部分讲人们是如何处理记忆中的信息的,印象最深的是讲mental representation。人们做决策、判断、评估的时候,不仅仅是激活了大脑中的知识而已,人们还对这些知识进行了加工。Mental representations就是这一系列的认知活动的产物。“Implicational molecules”是对这个现象进行的研究中出现的buzzword。比如“一分钱一分货”就是最简单也常见的一个molecule,我们一旦得到了某物品的“价格贵”这一信息,我们会同时认为该物品“质量好”,哪怕我们没有得到关于该物品质量的任何具体信息。

第四部分讲人们对信息的评估。印象深刻的是讲Probabilistic inference—likelihood that statement is true;Evaluation—judgment of liking, favorableness和Preference—comparative judgment (A is better than B) 。这部分内容容易与第二部分混淆,第二部分重点讲effects of social context in which information is received on how it is interpreted, responses made to it,而第四部分重点讲对信息的评估本身。

下学期,Wyer还将继续在中大讲这门课,预计会讲下面四个部分的内容:

1. Motivational Factors underlying responses to information

2. Role of Affect and Subjective Experience on Judgment

3. Attitude Formation and change; Impact of Attitudes on Behavior

4. Cultural Influences on Judgment

讲课特点

Wyer虽然年纪已经比较大(70左右?),但仍然精力旺盛。但讲课不用麦克风,不做PPT。只是在每次讲课前会讲讲课的大纲发给我们。大纲十分简要,也不像很多老师讲课的内容一样,分门别类,一二三。讲课内容基本上是在一个主题下,一个实验接着一个实验。讲述在相关主题下的各个经典实验案例。其中有很大一部分,是他本人做的studies。

这种讲课形式,比较难让人抓住points,很容易lost。好在有大堆的readings,如果课后苦读,还是能自己提炼出个一二三来。

Wyer本人还是挺有个人魅力的,典型的(至少是我想象中典型的)美国教授。著述颇丰,真的难以想象老人家怎么那么能写!在各个subfield都有十分具有分量的论文。有一批“标准引文”。比如提到knowledge accessibility时候就会引用他和Srull提出的“memory bin”模型。

课程作业

这个部分比较让人抓狂。可以说,这个课程结束了,我还是不敢说我很精确地领会了Wyer的意图。课程讲了四个部分,有四次作业。每次作业就是在所讲授的subfield里面,自己设计一个实验。分四个部分写:一、研究假设;二、假设之所以能够成立背后的理论依据、机制;三、能够建议该假设的实验设计;四、预计的结果(以表格形式呈现)。四部分加起来,双倍行距,不超过4页半纸。

这个作业要求的“四部曲”,大概可以称得上是我这学期最大的收获。开门见山提出假设,为什么提出这个假设,怎么测验这个假设,预计得到什么结果,环环相扣。不需要写什么introduction,literature review等等。连引文都只需要作者,年份,如(Wyer & Srull, 1989),不需要在最后列出引文具体出处。Wyer对文献的熟悉程度,让我实在是佩服。

作业最初的挑战,是写不清楚。常常很多问题,或者实验设计,我觉得我写清楚了,Wyer觉得not clear,或者干脆就没看到。令人十分崩溃。仔细想想,确实是自己的问题。到了第三、四次作业,基本上算是能写清楚,能让Wyer明白我想说的是什么。前两次的作业,大概需要他很费心地去猜我的意思。我后来发现,大概只要把作业写清楚了(包括达到假设、理论机制、实验设计和预计结果的internal consistency),基本就能拿7分以上(满分10分)。

随后面临的问题,是没有innovative的idea。Wyer明确说,不要把人家的study简单的apply到我们自己所在的领域,要提出新假设,要innovative,creative。难!自己的提出的假设,往往就“从文献中来,到文献中去”了。所谓从文献中来,是指提出的假设基本上都是模仿既有的study,照猫画虎。所谓到文献中去,是指自己提出的假设实在是没什么innovative的,基本上是一个改进版(有时候甚至连这个都做不到)的重复而已。如果真的能有innovative的idea,基本上就能发paper。我作业最高的一次,改到了9.5分。我问Wyer,是否有希望发SSCI。Wyer说,你把下面这些那些问题都有效地改正了,做完pilot study证明可行了,还是“high risk”。唉。。。

我前面之所以说这个作业要求的“四部曲”可能是我这学期最大的收获,是因为我觉得这四步看似简单,但实际上已经是一个完整的研究的核心。我作为一个初学者,不仅仅在这门课程里,在其他的研究中也一样,常常会舍本逐末,先从introduction想起。把大量的精力及literature review放在what’s new上面,而对问题本身的检讨不够严谨。最常犯的错误就是,对为什么我要研究这个问题说了很多,但是对为什么我提出的假设在理论上是应该成立的说的不够。通常就是某某某的研究说明,A会影响B,于是我也假设A会影响B。但是某某某又说,C会影响B,于是我也假设C是个moderator,之类。现在反思来看,有点舍本逐末,不分轻重了。

阅读材料

很惭愧,Wyer给我们的Readings,我到现在也没有全部看完。重点看了各个部分review的文章和几个经典的studies。因为我没有完整地看完所有的Reading,更没有系统地接触过consumer psychology,只能是相信Wyer这个人,进而相信Wyer给出的reading list应该是adequate and useful。就我有限的阅读经验来看,Wyer本人写的那些,看起来“共鸣”最强。一则因为Wyer上课讲的关键词跟他写的文章的关键词比较match,看起来不费劲;二则因为Wyer写文章不跩文,不乱用概念,基本上属于“言简意赅”。跟其他人的文章比起来,算是易读。(reading里的有些文章,真的算是难读,全怪罪于我的英文水平也不见得,因为课后交流发现许多同学读那文章也是云山雾罩。)

检讨收获

一,毋庸置疑的,比较大的收获是熟悉了consumer psychology这个领域的相关词汇。这些词汇的习得是非常有用的。至少我比以前知道,哪些现象对应哪些专业词汇,该用什么关键词去搜索。

二,知道了这个领域的big names。除了Wyer以外,比如Srull,Schwarz,Bargh,Higgins,Adaval,McGuire以及大名鼎鼎的Kahneman和Tversky。通过读一个领域的大人物的文章去了解一个领域的发展,应当算是一条捷径。

三,对实验研究有了一点体会。Wyer的课程,基本上只讲消费者研究中基于实验的研究,不涉及其他定性、定量的研究。这是我之前很少接触到的。相比较调查及regression analysis,实验基本上很难handle四维及以上的研究。也就是说,如果一个实验里,涉及四个变量,那几乎就是非常tough的任务了(至少是一个2×2×2×2的矩阵)。而四个变量在regression里面,只能算是一个小case。关于这一点,我还有一些其他的思考。比如,我们做的regression类的研究,用谢宇的话说,主要还是在研究grouping及其呈现的variances。研究这些variances,是帮助我们认识一个已经存在的社会现象。而实验则不然,它关心的是造成这种variances的processes。实验的manipulation比调查强得多。我个人觉得最关键的区别是,调查和实验背后的研究哲学不同。前者侧重认识variances本身,而后者侧重对造成variances的机制的判定。比如,我们或许通过调查发现,不同教育程度的人,对国家身份认同的程度有差别。这(往往)可以被解释为是教育程度造成了这种variance。但,实际上,只是不同教育程度的人在这方面存在了variance,至于是否是教育程度造成了这种variance,调查及回归分析是很难真的去证明的。而实验则不同,实验的manipulation强,对于是否A造成了B,实验的结果要比调查确定的多。当然,实验也有说不清却不得不说的地方。比如Wyer & Srull那个著名的Memory Bin,意思是说,人们的知识存在记忆中,像存在一个罐子里,一层一层的。当某个信息被激活的时候,他就会被放在罐子的最顶层,也就最accessible。这个memory bin被成功的用来解释了很多实验的结果,尤其是关于priming的。但是,这个memory bin其实有点儿“想象”的味道,实验本身并没有证明了这个memory bin的存在,只是这个memory bin用来解释一系列实验结果是reasonable的。这就有点儿研究的“想象力”的味道了。Wyer在上课时常常问我们关于一个实验结果,有什么理论可以用来解释,有什么competing的解释,有什么办法可以来检验这两种或多种competing theories中,究竟是哪一种起作用。这种训练对于我来说是非常有用的,尽管对于我来说,这也是challenging tasks。

四,最后一点能想到的,是聪明反被聪明误。上这个课,再次证明,耍小聪明是没有用的。学点东西,非下苦功不可。Innovative,creative,不读大量的readings是出不来的。