首页 > 代码库 > 经典的观点挖掘算法(文本挖掘系列)

经典的观点挖掘算法(文本挖掘系列)

    最近阅读了一篇关于观点挖掘KDD论文(Mining and Summarizing Customer Reviews,KDD04),其挖掘算法很经典,特此做记录。
    该论文要解决的问题是,识别用户评论的情感(positive or negative),并作归纳,为用户购买产品提供真实有效的参考。归纳的形式如下(以数码相机为例):
   数码相机:
        特征: 照片质量
            Positive:    253
                                <用户评论的句子>
            Negative:    8
                                <用户评论的句子>
        
        特征: 大小
            Positive:    135
                                <用户评论的句子>
            Negative:    12
       ……

算法过程
1. 主要步骤:
   <1> 通过用户的评论挖掘物品的特征
    <2> 识别包含观点的句子的情感
    <3> 归纳结果
这个算法与之前的算法相比,亮点在于,以物品的特征(feature-based)来判断句子的情感。
算法采用的情感分析基于句子级别(sentence-level),而不是文档级别(document-level)。

2. 挖掘过程
先上图,便于直观理解:

(1) Crawl Reviews:
     第一步当然就是爬虫,从网站上抓取用户评论并存储。

(2) POS Tagging:
     使用NLProcessor或StanFord Parser(推荐使用)对用户的每一句评论打POS标签,POS标签会给每个词标注词性,就像这样:
     I/FW recently/RB purchased/VBD the/DT canon/JJ powershot/NN g3/NN and/CC am/VBP extremely/RB satisfied/VBN with/IN the/DT purchase/NN ./.
    (原句是:I recently purchased the canon powershot g3 and am extremely satisfied with the purchase . )

(3) Frequent Feature Identification:
    要挖掘物品的特征,那么就要从句子中找到特征词。特征词都是名词,在第二个步骤的例子中,NN代表的就是名词。先将NN标注的名词或名词短语都抽取出来,然后根据关联规则挖掘(association-rule mining)找出频繁特征集(频繁特征是指,在名词总数量中所占的比例大于最小支持度的特征)。

(4) Feature Pruning:
   剪枝是最重要的步骤之一,可以非常大地提高算法的效果。此算法进行了两次剪枝:
   a. Compactness pruning
    频繁特征集包含特征短语。由于抽取特征短语不是人工进行的,而是直接把相邻的两个或多个名词组成短语,这样组成的短语不一定有意义。因此需要判断并决定是否剪枝。判断规则是:短语包含的两个或多个名词如果出现在同一个句子中,则按顺序计算两两之间的距离。如果每两个名词之间都不超过3个单词的距离,则认为这个特征短语是compact的(有影响力的)。如果特征短语有影响力的句子不超过2个,则认为这个特征短语应该被去除掉,即剪枝。
    个人认为,这个剪枝作用不大。因为被筛选为频繁特征集的短语,在所有名词中占的比例是比较大的;在用户评论的句子特别多的情况下,包含某个特征短语的句子一般都会超过2个。所以,这个剪枝对频繁特征集基本没什么影响。

   b. Redundancy pruning
    考虑一种情况:camera的特征短语 picture quality 是一个很有意义的特征,但是如果将两个词分开,变成单独的 picture 和 quality 时还很有意义吗?显然不是,picture 是要说明相机的拍照像素高,还是说明相机拍照色彩好?没有指明,那么 picture 就说明不了相机哪方面好坏。同样,quality 是说明拍照图片好看,还是相机电池质量好?还是不能说明相机到底什么好或者坏。所以要去掉包含在某个特征短语中且没有意义的特征。
    剪枝的规则是,对于特征A,如果某个特征短语也包含A,那么计算A在句子中单独出现的次数(包含A的特征短语不能出现在这个句子中)。如果次数小于一个阈值(论文中设为3),那么该特征短语被去除。这个剪枝的效果还是挺明显的。

(5) Opinion Word Extraction:
    在包含频繁特征的句子中,抽取距离特征最近的形容词,作为观点词。在POS标签中,JJ表示形容词

(6) Opinion Orientation Identification:
    这个步骤是算法最大的亮点之一,识别了观点词的语义方向(Positive or Negative),即极大程度地识别了用户对物品某一特征的情感。识别的方法是:预设30个极性明显的形容词,存储在seedList,作为已知极性的观点词集。例如,Positive:great、fantastic、nice、cool,Negative:bad、disappointing、dull等等。
    首先,对于观点词O,在WordNet中查找O的同义词。如果同义词存在于seedList中,则已知该同义词的词性,将O设为同一词性;然后把O加入到seedList中(扩充seedList)。如果同义词不存在于seedList中,则查找O的反义词。如果反义词存在seedList中,则将O设为相反词性,并加入到seedList。如果查找不到,则继续查找下一个观点词。
   不断迭代上述的查找过程,直至seedList的大小不再扩充。对于查找不到词性的观点词,则认为该词是无效的词。

(7) Infrequent Feature Identification:
    考虑到一种情况,有一些物品的特征是一部分用户特殊关注的,例如某些用户很关注相机软件(软件是相机的特征之一)的用户体验性。所以,应该识别这些特征,满足用户实际的需求。
    因为同一个观点词可以修饰多个特征,例如amazing(极好的)可以修饰相机的照片质量,也可以修饰相机的软件。所以,识别非频繁特征集的一个简单而有效的方法是,在包含观点词的句子中,找到距离观点词最近的名词,作为非频繁特征集

(8) Opinion Sentence Orientation Identification:
    最后一个重要的步骤是判断句子的情感方向(注意只判断包含观点词的句子)。判断的规则是:
    a. 抽取句子中的所有形容词,判断其词性,包含一个Positive词性的形容词就加1,包含一个Negative词性的形容词就减1。如果句子最后的值大于0,则句子的情感为Positive;如果值小于0,则为Negative。如果刚好等于0,请看下一步。
    b. 对于值刚好等于0的句子,则判断句子的属于观点词集的形容词,而不是所有的形容词。因为观点词更能体现用户的情感方向。与上一步骤类似,进行加1或减1操作,如果值大于0,则Positive;如果小于0,则Negative。那么,如果刚好又等于0,怎么办?
    c. 如果刚好又等于0,那么就认为当前句子的情感方向与前一个句子的情感方向是一样的。因为用户更倾向于在同一段话(包含多个句子)中只表扬或只批评物品。

(9) Summary Generation:
    最后的步骤便是,计算物品每个特征所属的句子是Positive或Negative的个数。然后,按照本文开头的形式进行归纳,得到Summary。

经典的观点挖掘算法(文本挖掘系列)