NLP情感分析|流程概述(一)

大家好,我是厦门大学数学科学学院的15级本科生@暴烈的谢兔子 ,在这个新开的系列中,我将和大家分享一下文本情感分析(Sentiment Analysis)的相关文章。刚入坑不久,如果文章中有出现错误或者遗漏之处,还望各位不吝赐教!

一、情感分析名词概述

『What』

情感分析是文本分类的一个分支,是对带有情感色彩(褒义贬义/正向负向)的主观性文本进行分析,以确定该文本的观点、喜好、情感倾向。

例如说,文本”这是书读来爱不释手”归为正向,”这本书很难看”归为负向。当然也有层次更多的分类。

『Why』

被研究的主观性文本包括顾客对某个产品的评论,大众对某个新闻热点事件的观点等。通过这些文本,商家可以为消费者提供决策参考,相关机构也可以了解舆情,但人工分析耗费大量成本。

『How』

目前有基于情感词典的情感分析和基于机器学习的情感分析这两种主流方法。

【基于情感词典】是指根据已构建的情感词典,对待分析文本进行文本处理抽取情感词,计算该文本的情感倾向。最终分类效果取决于情感词典的完善性。

【基于机器学习】是指选取情感词作为特征词,将文本矩阵化,利用logistic Regression, 朴素贝叶斯(Naive Bayes),支持向量机(SVM)等方法进行分类。最终分类效果取决于训练文本的选择以及正确的情感标注。

(觉得有点抽象的后文有例解)

当然,特定情况下研究某些文本时也可以将两种方法结合起来。

比如说某些领域的文本没有标注,该领域的情感词典也不够完善,而人工标注需要耗费大量成本,数据的采集相对于人工成本小很多时;可以选取部分文本,利用基本情感词典的方法粗略地计算这些文本的情感得分值,选取分值偏高或偏低的文本作为已标注的训练文本 。再结合机器学习的方法进行分析。

(二)、情感分析流程例解

在本篇文章中,我试图用最简洁的语言和图例展现这两种分类方式。

(1)基于情感词典的情感分析

以下是我一条猫眼上选取的《西游伏妖篇》影评:

Review1 =“周星驰+徐克,把观众期待度放到很大,看后小失望。特效场景、人物服饰、经典创新这些方面都很值得欣赏,可惜硬伤是一众主演演技尴尬,剧情超级无聊,走神好多次。”

我们现在有以下词典:

《NLP情感分析|流程概述(一)》
《NLP情感分析|流程概述(一)》

情感词:设定positive的词+1,negative的词-1;

程度词:比如出现”小失望”就 -1*1,出现”非常失望”就-1*3

那么这句话的情感总分值就是 1*3-1*1+1*3-1-1*3 = 1

其中正向得分:1*3+1*3-1*3 = 3,负向得分 |-1*1-1|=2

可输出[review1 : 1 ] or [review1: (3,2)].

——————————————分界线—————————————————

中文分词可利用jieba, THULAC,ICTCLAS

该方法的重点在于『构建适合的情感词典』,不在此赘述,会在后续文中填上。

(2)基于机器学习的情感分析

若以下是一些政治方面的新闻文本

《NLP情感分析|流程概述(一)》
《NLP情感分析|流程概述(一)》

  1. 首先人工标注好其情感分类。正向为1,负向为0。
  2. 我们要选取这些文本中的【特征词】,比如说做情感分类时的特征词要选取情感词,做商品分类时要选取商品名、商品特别的描述词等,构造词袋(bags of words)模型。
    即统计各词词频,形成如下词矩阵:

其中A,B,C,D… 代表各情感词,每一行代表一个文本,每个数代表在该文本中该特征词词频。

《NLP情感分析|流程概述(一)》

用numpy的数据类型将该数据储存起来

【生成词向量的方法英文处理可考虑库gensim, 并且Multiangle’s Notepad 这篇博客有详细介绍“利用gensim和sklearn搭建一般文本分类器方法”】

  1. 将数据集分为n份,其中n-1份为训练集,1份测试集,从库sklearn中载入svm, logisticRegression, NB等分类算法。
    train_set = data[1:i,:] #i-1个数据作为训练集
    test_set = data[i:,:] #剩余的数据作为测试集,训练集要远多于测试集
    
    
    
    train = train_set[:,1:]
    tag = train_set[:, 0] #第一列是类标签
    
    
    import sklearn
    from sklearn import svm
    from sklearn.linear_model import LogisticRegression
    from sklearn.naive_bayes import GaussianNB
    
    
    clf_svm = svm.LinearSVC() 
    clf_svm_res = clf_svm.fit(train,tag)
    train_pred  = clf_svm_res.predict(train)
    test_pred   = clf_svm_res.predict(test_set)
    
    clf_lr = LogisticRegression()
    ...
    
    clf_nb = GaussianNB()
    ...
    
  2. 测试集轮换重复n次,使用交叉验证测试分类器的准确度。在此另n=10.
    比较不同分类器的准确率,比较选出最优的。
  3. from sklearn import cross_validation
    
    kfold = cross_validation.KFold(len(x1), n_folds=10)
    
    svc_accuracy = cross_validation.cross_val_score(clf_svm, train, tag, cv=kfold)
    
    
    print 'SVM average accuary: %f' %svc_accuracy.mean()
    
    ...

————————分界线——————————

这种方法的重点在于特征选取。

三、结语

本篇只是概述,具体的实现原理和代码实现方式都将在后文呈现。

下一篇文章将详细介绍中文文本的预处理和情感词典的构建。

非商业转载注明作者即可,商业转载请联系作者授权并支付稿费。本专栏已授权“维权骑士”网站(http://rightknights.com)对我在知乎发布文章的版权侵权行为进行追究与维权。

作者:@暴烈的谢兔子
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

项目联系方式:

    原文作者:暴烈的谢兔子
    原文地址: https://zhuanlan.zhihu.com/p/25065579
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞