情感分析
·最常用于微博、微信、用户论坛等语境下的短文本分析
·大量的文本预处理技术需求[ 网页解析,文本抽取,正则表达式等 ]
·情感分析的特殊性
·文本长度相对较短
·语境比较独特
·需要提取的信息量较为特别( ·否定词,歧义词可能导致明显误判·新词出现速度很快·分词很难做到尽善尽美)
数据概况:
抓取自购物网站的正向、负向评论各约1 万条。涵盖了数码、书籍、食品等多个领域。
基于词典进行情感分析
·情感字典( sentiment dictionary)
·还行1 * 不错2 ·不好- 2 太差了- 3
·否定词的处理: 前向搜索若干词条,以进行翻转
·情感得分的计算
·加载情感字典为Dict
·遍历句子中的词条,将对应的分值相加
·分值之和作为该句的情感得分
·所有句子的情感得分的平均值作为该文本的情感得分
基于词袋模型进行情感分析
·用金标准得到已准确分类的训练样本
·以词袋模型为基础,将情感分析完全看作是文本分类的一个简单实例来进行处理
·可按照分类进行预测,也可按照情感分值进行预测·需要对模型准确率和速度进行权衡
·效果较词典模型更好,但仍然忽略了上下文的关联信息
·可以考虑使用bigram或者trigram方式抽取词条,以同时考虑否定词和程度副词的影响
·可以考虑使用关键词进行模型拟合
import pandas as pd
dfpos = pd. read_excel( "购物评论.xlsx" , sheet_name = "正向" , header = None )
dfpos[ "Y" ] = 1
dfneg = pd. read_excel( "购物评论.xlsx" , sheet_name = "负向" , header = None )
dfneg[ "Y" ] = 0
df0 = dfpos. append( dfneg, ignore_index = True )
df0. head( )
import jieba
cuttxt = lambda x: " " . join( jieba. lcut( x) )
df0[ "cleantxt" ] = df0[ 0 ] . apply ( cuttxt)
df0. head( )
from sklearn. feature_extraction. text import CountVectorizer
countvec = CountVectorizer( min_df = 5 )
wordmtx = countvec. fit_transform( df0. cleantxt)
wordmtx
from sklearn. model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split( wordmtx , df0. Y , test_size = 0.3 )
x_train[ 0 ]
from sklearn. svm import SVC
clf = SVC( kernel = 'rbf' , verbose= True )
clf. fit( x_train, y_train)
clf. score( x_train, y_train)
from sklearn. metrics import classification_report
print ( classification_report( y_test, clf. predict( x_test) ) )
clf. predict( countvec. transform( [ df0. cleantxt[ 0 ] ] ) ) [ 0 ]
import jieba
def m_pred ( string, countvec, model) :
words = " " . join( jieba. lcut( string) )
words_vecs = countvec. transform( [ words] )
result = model. predict( words_vecs)
if int ( result[ 0 ] ) == 1 :
print ( string, ":正向" )
else :
print ( string, ":负向" )
comment = "外观美观,速度也不错。上面一排触摸键挺实用。应该对得起这个价格。当然再降点大家肯定也不反对。风扇噪音也不大。"
m_pred( comment, countvec, clf)
comment = "作为女儿6.1的礼物。虽然晚到了几天。等拿到的时候,女儿爱不释手,上洗手间也看,告知不好。竞以学习毛主席来反驳我。我反对了几句,还说我对主席不敬。晕。上周末,告诉我她把火鞋和风跬拿到学校,好多同学羡慕她。呵呵,我也看了其中的人鸦,只可惜没有看完就在老公的催促下睡了。说了这么多,归纳为一句:这套书买的值。"
m_pred( comment, countvec, clf)
基于Word2vec的情感分析
·通过训练,把对文本内容的处理简化为K维向量空间中的向量运算,在捕捉上下文语境信息的同时也压缩了数据规模
·训练得到的词向量蕴含了上下文信息,因此做情感分析更合适
·由于文本长度各异,因此考虑将所有词向量的平均值作为分类算法的输入值,从而对整个文本文档进行分类处理(微博短文)
·对于分析长文本,采用Doc2vec来创建输入信息更为合适,它可以将整段句子表征为实数值向量
和词袋模型相比,分布式表达主要是改变了文本信息的提取方式。目前主要使用gensim实现相应的算法。
注意: 由于矩阵不再是频数值,因此不能使用朴素贝叶斯算法来进行拟合。
import pandas as pd
dfpos = pd. read_excel( "购物评论.xlsx" , sheet_name = "正向" , header = None )
dfpos[ "Y" ] = 1
dfneg = pd. read_excel( "购物评论.xlsx" , sheet_name = "负向" , header = None )
dfneg[ "Y" ] = 0
df0 = dfpos. append( dfneg, ignore_index = True )
df0. head( )
import jieba
df0[ "cut" ] = df0[ 0 ] . apply ( jieba. lcut)
df0. head( )
from sklearn. model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split( df0. cut , df0. Y , test_size = 0.3 )
x_train[ : 2 ]
from gensim. models. word2vec import Word2Vec
n_dim = 300
w2vmodel = Word2Vec( vector_size= 100 , min_count= 10 )
w2vmodel. build_vocab( x_train)
w2vmodel. train( x_train, total_examples= w2vmodel. corpus_count, epochs= 10 )
w2vmodel. wv. most_similar( "不错" )
w2vmodel. wv. most_similar( "失望" )
pd. DataFrame( [ w2vmodel. wv[ w] for w in df0. cut[ 0 ] if w in w2vmodel. wv ] ) . head( )
def m_avgvec ( words, w2vmodel) :
return pd. DataFrame( [ w2vmodel. wv[ w] for w in words if w in w2vmodel. wv] ) . agg( "mean" )
train_vecs = pd. DataFrame( [ m_avgvec( s, w2vmodel) for s in x_train] )
train_vecs. head( )
from sklearn. svm import SVC
clf2 = SVC( kernel = 'rbf' , verbose = True )
clf2. fit( train_vecs, y_train)
clf2. score( train_vecs, y_train)
from sklearn. metrics import classification_report
print ( classification_report( y_train, clf2. predict( train_vecs) ) )
import jieba
def m_pred ( string, model) :
words = jieba. lcut( string)
words_vecs = pd. DataFrame( m_avgvec( words, w2vmodel) ) . T
result = model. predict( words_vecs)
if int ( result[ 0 ] ) == 1 :
print ( string, ":正向" )
else :
print ( string, ":负向" )
comment = "作为女儿6.1的礼物。虽然晚到了几天。等拿到的时候,女儿爱不释手,上洗手间也看,告知不好。竟以学习毛主席来反驳我。我反对了几句,还说我对主席不敬。晕。上周末,告诉我她把火鞋和风跬拿到学校,好多同学羡慕她。呵呵,我也看了其中的人鸦,只可惜没有看完就在老公的催促下睡了。说了这么多,归纳为一句:这套书买的值。"
m_pred( comment, clf2)