在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