python做自然语言处理:使用机器侦测文本的语言类型与文本表达的情感

97 views
Skip to first unread message

lingfei wu

unread,
Apr 26, 2012, 12:33:53 PM4/26/12
to computational-communication
在CS里自然语言处理(NLP)是一个很专门的学科,很多互联网公司都设有这个部门。我本来对这块知之甚少,从个人的taste来说,对结构、动力之类的东西做得比较多,总觉得对内容的分析充满各种不确定性,很难找到普遍性的规律。这几天因为一个研究问题,需要搞一个判断网站使用语言的程序(就是你访问非浏览器默认语言的网站时,chrome给你弹出来的那个东西-----“你好,发现本网站使用的语言是爪哇国语言,是否要翻译为英语?”-----背后的程序),不得不进入自然语言处理的领地,快速地了解了一下python的nltk库。

自然地,最好的了解一个事物的办法就是实战,所以直接上手,在这篇这篇博客的指导下玩nltk。

首先,如何侦测语言?比如有这么一句话“Der schnelle braune Fuchs springt über den faulen Hund”, 我们想知道它是什么语言写的,附件程序中使用的办法是先全部使用小写字母,然后顺序切成一堆trigram,所谓trigram就是由三个字母组成的组合,例如"hund"切出来就是"hun, und",把这句话切成段后,把每一段扔到一种语言库里去,这个语言库是事先准备好的,一般有该语言几千到一万个常用词,通过对比这个常用词库,就知道在这个语言里找到hun这么一个三元组的概率xi是多少,然后再数数sne在我们这句话里出现的yi概率是多少,把所有三元组的xi*yi加起来,得到一个总值,这个总值最高的语言就是侦测出来的语言。根据我的理解,这个总值与“在该语言中找到文本”的概率成正比,但不是这个概率本身。我们举例的这句话,最后侦测出来是德语,确实是正确答案。

其次,如何分析情感?这里只是最简单的任务,要把一个文本code成positive或者negative两种情况。附件中程序背后的原理也非常简单,首先建立一个训练用的数据库,这里面有5句positive,5句negative。然后,把这些文本都切成词(是词,不是三元组,请注意),将这些词倒序排列,出现频次高的排在前面,越是前面的词,就是越可以成功地鉴别出文本是pos还是neg的词。这个时候当然,要先把the之类去掉,一个粗糙的办法 就是去掉所有长度在三个字母以下的词。这个时候,我们已经不叫这些词为词,而是叫特征(feature),有了这些feature,我们可以训练出一个分类器(classifier),进来新的一个文本,我们就看看,它在我们的数据库上的各项特征上的表现如何,给出一个综合评分,就可以判断这个文本是正面还是负面情感。分类器的类型很多,以朴素贝叶斯最为经典,就是预设这个文本在正面和负面情感上有一个先验分布(即资料库中正负面情感的分布),然后根据在各项特征上的表现来改变这个先验分布,得到后面分布。因为我们这里只需要在正面和负面中选择一个,所以就是二项式分布,得到后分布后,选择概率高的那个值(pos或neg),就可以。其他分类器有logistic,最大熵等等。这里只使用了文本中的词作feature,其实还可以有其他feature,如文本的结构,语法,长度,等等。在专业的网站上的推荐,例如facebook或者amazon,一个朋友或者一本书的后面,可能有几百种feature。附件2的程序中我用“you are horrible”来测试了一下,确实可以判断出是negative。但毕竟这里的语料库太小,不适合做更大规模的测试,附件3的程序调用了nltk本身的电影评论的语料库(2000条评论,每条评论几百字),判断语句有70%的准确率(附件三来源于这个网站)。

以上程序,基本没有什么修改,所以源代码的著作权不归我,大家做测试用即可,如果想在publication中使用,要联系原作者。

一个小小的修改是附件2的程序,原始的版本用了nltk.classify.apply_features这句命令,但不知为什么现在的nltk里classify这个module已经没有apply_features这个attribute了,所以我直接使用map来做,为此在之前新建t1,t2代替了原始代码中的tweets。

好消息是发现语言侦测、机器翻译、情感分析、等等背后都是类似的统计学习模型,并且引发了一些小小的思考(例如可能有人注意到在侦测语言时我们直接将“在语言A中找到文本i的概率”等同于“看到i我们认为它来自于语言A的概率”,这是一种最大似然估计思路,而不是贝叶斯思路,即没有考虑各个语言本身被使用的先验概率,那么如果补充考虑这个部分会不会识别准确率更高),坏消息是,浪费了几天时间来研究nltk,我的问题还没有解决,因为显然中文,日文等是不能切成三元组来比较概率的。有什么办法,还需要继续摸索。各位如果有思路,请告诉我。

(这个问题本来可以也可以用google translation api解决,但自从google发现 translation api被滥用后已经停用了这个api,所以现在要自己搞语料库和统计模型来识别)。


--
Wu  Lingfei
wlf8...@gmail.com
Dept. of Media & Communication
City University of Hong Kong

languageDetect.py
tweetsSentimentalDetection.py
movieReviewDetection.py

chengjun wang

unread,
Apr 26, 2012, 12:44:25 PM4/26/12
to computational...@googlegroups.com
have u tried the pre-classified test corpus given in the reply of the second blog post.


Best regards.                         
                                       
Chengjun Wang

Web Mining Lab
Department of Media and Communication
City university of Hong kong.
Room 5008, 18 Tat Hong AvenueRun Run Shaw Creative Media Centre
Kowloon. Hong Kong
Mobile: +61-0415675817(AU);+852-96442905  (HK)





2012/4/27 lingfei wu <wlf8...@gmail.com>

chengjun wang

unread,
Apr 26, 2012, 12:47:28 PM4/26/12
to computational...@googlegroups.com
Another one: sanders-twitter-0.2.zip 


Best regards.                         
                                       
Chengjun Wang

Web Mining Lab
Department of Media and Communication
City university of Hong kong.
Room 5008, 18 Tat Hong AvenueRun Run Shaw Creative Media Centre
Kowloon. Hong Kong
Mobile: +61-0415675817(AU);+852-96442905  (HK)





2012/4/27 chengjun wang <wang...@gmail.com>

Zhenzhen Wang

unread,
Apr 26, 2012, 8:49:55 PM4/26/12
to computational...@googlegroups.com
这个对我太有用啦~~~啦啦啦,令飞童鞋,我发现你的信息检索能力不是一般牛。
--
Department of Media and Communication

Zhenzhen Wang

unread,
Apr 27, 2012, 1:44:21 AM4/27/12
to computational...@googlegroups.com
对于汉语和日语这类语言,以单字为单位和词库进行匹配不可以吗?因为日语里含有很多汉语里没有的字。


在 2012年4月27日 上午12:33,lingfei wu <wlf8...@gmail.com>写道:



--
Department of Media and Communication

lingfei wu

unread,
Apr 28, 2012, 5:18:31 AM4/28/12
to computational...@googlegroups.com
理论上应该是可以的,既然中日韩都有词库,那应该是一个中文字一旦匹配上就基本上把结果搞定了。但因为原程序的思路是要把(拼音文字)term的字母拆开成trigrams来计算得出该term出现的概率,但中文字符(unicode)是不能拆开的,所以要在原始程序里另外写一个不拆开三元组的检测分支。
Reply all
Reply to author
Forward
0 new messages