注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Explore in Data

Just enjoy it.

 
 
 

日志

 
 

Python 文本挖掘:使用机器学习方法进行情感分析(原理)  

2013-11-19 21:45:42|  分类: Python 文本挖掘 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在这个系列的文章里面,机器学习都可以认为是有监督的分类方法。
总体流程如图:
Python 文本挖掘:使用机器学习方法进行情感分析(原理) - rzcoding - Explore in Data
 图1:机器学习的流程和结构(摘自《Natural Language Processing with Python》)

一、有监督意味着需要人工标注,需要人为的给文本一个类标签
比如我有5000条商品评论,如果我要把这些评论分成积极和消极两类。那我就可以先从里面选2000条评论,然后对这2000条数据进行人工标注,把这2000条评论标为“积极”或“消极”。这“积极”和“消极”就是类标签
假设有1000条评论被标为“积极”,有1000条评论被标为“消极”。(两者数量相同对训练分类器是有用的,如果实际中数量不相同,应该减少和增加数据以使得它们数量相同)

二、之后就要选择特征
特征就是分类对象所展现的部分特点,是实现分类的依据。我们经常会做出分类的行为,那我们依据些什么进行分类呢?
举个例子,如果我看到一个年轻人,穿着新的正装,提着崭新的公文包,快步行走,那我就会觉得他是一个刚入职的职场新人。在这里面,“崭新”,“正装”,“公文包”,“快步行走”都是这个人所展现出的特点,也是我用来判断这个人属于哪一类的依据。这些特点和依据就是特征。可能有些特征对我判断更有用,有些对我判断没什么用,有些可能会让我判断错误,但这些都是我分类的依据。
我们没办法发现一个人的所有特点,所以我们没办法客观的选择所有特点,我们只能主观的选择一部分特点来作为我分类的依据。这也是特征选择的特点,需要人为的进行一定选择。

而在情感分类中,一般从“词”这个层次来选择特征。
比如这句话“手机非常好用!”,我给了它一个类标签“Positive”。里面有四个词(把感叹号也算上),“手机”,“非常”,“好用”,“!”。我可以认为这4个词都对分类产生了影响,都是分类的依据。也就是无论什么地方出现了这四个词的其中之一,文本都可以被分类为“积极”。这个是把所有词都作为分类特征
同样的,对这句话,我也可以选择它的双词搭配(Bigrams)作为特征。比如“手机 非常”,“非常 好用”,“好用 !”这三个搭配作为分类的特征。以此类推,三词搭配(Trigrams),四词搭配都是可以被作为特征的。

三、再之后特征要降维
特征降维说白了就是减少特征的数量。这有两个意义,一个是特征数量减少了之后可以加快算法计算的速度(数量少了当然计算就快了),另一个是如果用一定的方法选择信息量丰富的特征,可以减少噪音,有效提高分类的准确率。
所谓信息量丰富,可以看回上面这个例子“手机非常好用!”,很明显,其实不需要把“手机”,“非常”,“好用”,“!”这4个都当做特征,因为“好用”这么一个词,或者“非常 好用”这么一个双词搭配就已经决定了这个句子是“积极”的。这就是说,“好用”这个词的信息量非常丰富。

那要用什么方法来减少特征数量呢?答案是通过一定的统计方法找到信息量丰富的特征。
统计方法包括:词频(Term Frequency)、文档频率(Document Frequency)、互信息(Pointwise Mutual Information)、信息熵(Information Entropy)、卡方统计(Chi-Square)等等。
在情感分类中,用词频选择特征,也就是选在语料库中出现频率高的词。比如我可以选择语料库中词频最高的2000个词作为特征。用文档频率选特征,是选在语料库的不同文档中出现频率最高的词。而其它三个,太高端冷艳,表示理解得还不清楚,暂且不表。。。
不过意思都是一样的,都是要通过某个统计方法选择信息量丰富的特征。特征可以是词,可以是词组合。

四、把语料文本变成使用特征表示
在使用分类算法进行分类之前,第一步是要把所有原始的语料文本转化为特征表示的形式。
还是以上面那句话做例子,“手机非常好用!” 
如果在NLTK 中,如果选择所有词作为特征,其形式是这样的:[ {“手机”: True, “非常”: True, “好用”: True, “!”: True} , positive]
如果选择双词作为特征,其形式是这样的:[ {“手机 非常”: True, “非常 好用”: True, “好用 !”: True} , positive ]
如果选择信息量丰富的词作为特征,其形式是这样的:[ {“好用”: True} , positive ]
(NLTK需要使用字典和数组两个数据类型,True 表示对应的元素是特征。至于为什么要用True 这样的方式,我也不知道。。。反正见到的例子都是这样的。。。有空再研究看是不是可以不这样的吧)

无论使用什么特征选择方法,其形式都是一样的。都是[ {“特征1”: True, “特征2”: True, “特征N”: True, }, 类标签 ]

五、把用特征表示之后的文本分成开发集测试集,把开发集分成训练集开发测试集
机器学习分类必须有数据给分类算法训练,这样才能得到一个(基于训练数据的)分类器。
有了分类器之后,就需要检测这个分类器的准确度。
根据《Python 自然语言处理》的方法,数据可以分为开发集合测试集。开发集专门用于不断调整和发现最佳的分类算法和特征维度(数量),测试集应该一直保持“不被污染”。在开发集开发完毕之后,再使用测试集检验由开发集确定的最佳算法和特征维度的效果。具体如图:
Python 文本挖掘:使用机器学习方法进行情感分析(原理) - rzcoding - Explore in Data
 图2:开发集和测试集(摘自《Natural Language Processing with Python》)

一般来说,训练集的数量应该远大于测试集,这样分类算法才能找出里面的规律,构建出高效的分类器。
用回前面的例子。假设2000条已经标注了积极和消极的评论数据,开发集可以是随机的1600条,测试集是剩余的随机400条。然后开发集中,训练集可以是随机的1400条,开发测试集是200条。

六、用不同的分类算法给训练集构建分类器,用开发测试集检验分类器的准确度(选出最佳算法后可以调整特征的数量来测试准确度)。
这个时候终于可以使用各种高端冷艳的机器学习算法啦!
我们的目标是:找到最佳的机器学习算法。
可以使用朴素贝叶斯(NaiveBayes),决策树(Decision Tree)等NLTK 自带的机器学习方法。也可以更进一步,使用NLTK 的scikit-learn 接口,这样就可以调用scikit-learn 里面的所有,对,是所有机器学习算法了。我已经忍不住的泪流满面。
其实方法很容易。只要以下五步。
1. 仅仅使用开发集(Development Set)。
2. 用分类算法训练里面的训练集(Training Set),得出分类器。
3. 用分类器给开发测试集分类(Dev-Test Set),得出分类结果。
4. 对比分类器给出的分类结果和人工标注的正确结果,给出分类器的准确度。
5. 使用另一个分类算法,重复以上三步。
在检验完所有算法的分类准确度之后,就可以选出最好的一个分类算法了。

在选出最好的分类算法之后,就可以测试不同的特征维度对分类准确度的影响了。一般来说,特征太少则不足以反映分类的所有特点,使得分类准确率低;特征太多则会引入噪音,干扰分类,也会降低分类准确度。所以,需要不断的测试特征的数量,这样才可以得到最佳的分类效果。

七、选择出开发集中最佳的分类算法和特征维度,使用测试集检验得出情感分类的准确度。
在终于得到最佳分类算法和特征维度(数量)之后,就可以动用测试集。
直接用最优的分类算法对测试集进行分类,得出分类结果。对比分类器的分类结果和人工标注的正确结果,给出分类器的最终准确度。


  评论这张
 
阅读(6580)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017