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

Explore in Data

Just enjoy it.

 
 
 

日志

 
 

Python 文本挖掘:使用机器学习方法进行情感分析(三、分类器及其准确度)  

2013-11-20 10:31:31|  分类: Python 文本挖掘 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在把文本转化为特征表示,并且分割为开发集和测试集之后,我们就需要针对开发集进行情感分类器的开发。测试集就放在一边暂时不管。

开发集分为训练集(Training Set)和开发测试集(Dev-Test Set)。训练集用于训练分类器,而开发测试集用于检验分类器的准确度。
为了检验分类器准确度,必须对比“分类器的分类结果”和“人工标注的正确结果”之间的差异。

所以第一步,是要把开发测试集中,人工标注的标签和数据分割开来。第二步是使用训练集训练分类器;第三步是用分类器对开发测试集里面的数据进行分类,给出分类预测的标签;第四步是对比分类标签和人工标注的差异,计算出准确度。

一、分割人工标注的标签和数据

dev, tag_dev = zip(*devtest) #把开发测试集(已经经过特征化和赋予标签了)分为数据和标签


二到四、可以用一个函数来做

def score(classifier):
classifier = SklearnClassifier(classifier) #在nltk 中使用scikit-learn 的接口
classifier.train(train) #训练分类器

pred = classifier.batch_classify(testSet) #对开发测试集的数据进行分类,给出预测的标签
return accuracy_score(tag_test, pred) #对比分类预测结果和人工标注的正确结果,给出分类器准确度


之后我们就可以简单的检验不同分类器和不同的特征选择的结果

import sklearn

from nltk.classify.scikitlearn import SklearnClassifier
from sklearn.svm import SVC, LinearSVC, NuSVC
from sklearn.naive_bayes import MultinomialNB, BernoulliNB
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score


posFeatures = pos_features(bag_of_words) #使用所有词作为特征
negFeatures = neg_features(bag_of_words)


print 'BernoulliNB`s accuracy is %f' %score(BernoulliNB())
print 'MultinomiaNB`s accuracy is %f' %score(MultinomialNB())
print 'LogisticRegression`s accuracy is %f' %score(LogisticRegression())
print 'SVC`s accuracy is %f' %score(SVC())
print 'LinearSVC`s accuracy is %f' %score(LinearSVC())
print 'NuSVC`s accuracy is %f' %score(NuSVC())

1. 我选择了六个分类算法,可以先看到它们在使用所有词作特征时的效果:

BernoulliNB`s accuracy is 0.790000
MultinomiaNB`s accuracy is 0.810000
LogisticRegression`s accuracy is 0.710000
SVC`s accuracy is 0.650000
LinearSVC`s accuracy is 0.680000
NuSVC`s accuracy is 0.740000


2. 再看使用双词搭配作特征时的效果(代码改动如下地方即可)

posFeatures = pos_features(bigrams)
negFeatures = neg_features(bigrams)

结果如下:

BernoulliNB`s accuracy is 0.710000
MultinomiaNB`s accuracy is 0.750000
LogisticRegression`s accuracy is 0.790000
SVC`s accuracy is 0.750000
LinearSVC`s accuracy is 0.770000
NuSVC`s accuracy is 0.780000


3. 再看使用所有词加上双词搭配作特征的效果

posFeatures = pos_features(bigram_words)
negFeatures = neg_features(bigram_words)

结果如下:

BernoulliNB`s accuracy is 0.780000
MultinomiaNB`s accuracy is 0.780000
LogisticRegression`s accuracy is 0.780000
SVC`s accuracy is 0.600000
LinearSVC`s accuracy is 0.790000
NuSVC`s accuracy is 0.790000


可以看到在不选择信息量丰富的特征时,仅仅使用全部的词或双词搭配作为特征,分类器的效果并不理想。
接下来将使用卡方统计量(Chi-square)来选择信息量丰富的特征,再用这些特征来训练分类器。
4. 计算信息量丰富的,并以此作为分类特征

word_scores = create_word_scores()

best_words = find_best_words(word_scores, 1500) #选择信息量最丰富的1500个的特征


posFeatures = pos_features(best_word_features)
negFeatures = neg_features(best_word_features)

结果如下:

BernoulliNB`s accuracy is 0.870000
MultinomiaNB`s accuracy is 0.860000
LogisticRegression`s accuracy is 0.730000
SVC`s accuracy is 0.770000
LinearSVC`s accuracy is 0.720000
NuSVC`s accuracy is 0.780000

可见贝叶斯分类器的分类效果有了很大提升。

5. 计算信息量丰富的词和双词搭配,并以此作为特征

word_scores = create_word_bigram_scores()

best_words = find_best_words(word_scores, 1500) #选择信息量最丰富的1500个的特征


posFeatures = pos_features(best_word_features)
negFeatures = neg_features(best_word_features)

结果如下:

BernoulliNB`s accuracy is 0.910000
MultinomiaNB`s accuracy is 0.860000
LogisticRegression`s accuracy is 0.800000
SVC`s accuracy is 0.800000
LinearSVC`s accuracy is 0.750000
NuSVC`s accuracy is 0.860000

可以发现贝努利的贝叶斯分类器效果继续提升,同时NuSVC 也有很大的提升。

此时,我们选用BernoulliNB、MultinomiaNB、NuSVC 作为候选分类器,使用词和双词搭配作为特征提取方式,测试不同的特征维度的效果。

dimension = ['500','1000','1500','2000','2500','3000']

for d in dimension:
word_scores = create_word_scores_bigram()
best_words = find_best_words(word_scores, int(d))

posFeatures = pos_features(best_word_features)
negFeatures = neg_features(best_word_features)


train = posFeatures[174:]+negFeatures[174:]
devtest = posFeatures[124:174]+negFeatures[124:174]
test = posFeatures[:124]+negFeatures[:124]
dev, tag_dev = zip(*devtest)

print 'Feature number %f' %d
print 'BernoulliNB`s accuracy is %f' %score(BernoulliNB())
print 'MultinomiaNB`s accuracy is %f' %score(MultinomialNB())
print 'LogisticRegression`s accuracy is %f' %score(LogisticRegression())
print 'SVC`s accuracy is %f' %score(SVC())
print 'LinearSVC`s accuracy is %f' %score(LinearSVC())
print 'NuSVC`s accuracy is %f' %score(NuSVC())
print

结果如下(很长。。):

Feature number 500

BernoulliNB`s accuracy is 0.880000
MultinomiaNB`s accuracy is 0.850000
LogisticRegression`s accuracy is 0.740000
SVC`s accuracy is 0.840000
LinearSVC`s accuracy is 0.700000
NuSVC`s accuracy is 0.810000

Feature number 1000
BernoulliNB`s accuracy is 0.860000
MultinomiaNB`s accuracy is 0.850000
LogisticRegression`s accuracy is 0.750000
SVC`s accuracy is 0.800000
LinearSVC`s accuracy is 0.720000
NuSVC`s accuracy is 0.760000

Feature number 1500
BernoulliNB`s accuracy is 0.870000
MultinomiaNB`s accuracy is 0.860000
LogisticRegression`s accuracy is 0.770000
SVC`s accuracy is 0.770000
LinearSVC`s accuracy is 0.750000
NuSVC`s accuracy is 0.790000

Feature number 2000
BernoulliNB`s accuracy is 0.870000
MultinomiaNB`s accuracy is 0.850000
LogisticRegression`s accuracy is 0.770000
SVC`s accuracy is 0.690000
LinearSVC`s accuracy is 0.700000
NuSVC`s accuracy is 0.800000

Feature number 2500
BernoulliNB`s accuracy is 0.850000
MultinomiaNB`s accuracy is 0.830000
LogisticRegression`s accuracy is 0.780000
SVC`s accuracy is 0.700000
LinearSVC`s accuracy is 0.730000
NuSVC`s accuracy is 0.800000

Feature number 3000
BernoulliNB`s accuracy is 0.850000
MultinomiaNB`s accuracy is 0.830000
LogisticRegression`s accuracy is 0.780000
SVC`s accuracy is 0.690000
LinearSVC`s accuracy is 0.710000
NuSVC`s accuracy is 0.800000


把上面的所有测试结果进行综合可汇总如下:
不同分类器的不同特征选择方法效果
bag_of_words bigrams bigram_words best_word_feature best_word_bigram_feature
BernoulliNB 0.79 0.71 0.78 0.87 0.91
MultinomiaNB 0.81 0.75 0.78 0.86 0.86
LogisticRegression 0.71 0.79 0.78 0.73 0.8
SVC 0.65 0.75 0.6 0.77 0.8
LinearSVC 0.68 0.77 0.79 0.72 0.75
NuSVC 0.74 0.78 0.79 0.78 0.86

候选分类器在不同特征维度下的效果
500 1000 1500 2000 2500 3000
BernoulliNB 0.88 0.86 0.87 0.87 0.85 0.85
MultinomiaNB 0.85 0.85 0.86 0.85 0.83 0.83
NuSVC 0.81 0.76 0.79 0.7 0.8 0.8



综合来看,可以看出特征维数在500 或 1500的时候,分类器的效果是最优的。

所以在经过上面一系列的分析之后,可以得出如下的结论:
Bernoulli 朴素贝叶斯分类器效果最佳
词和双词搭配作为特征时效果最好
特征维数为1500时效果最好
  评论这张
 
阅读(7017)| 评论(10)
推荐 转载

历史上的今天

评论

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

页脚

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