赞
踩
情感分析
·最常用于微博、微信、用户论坛等语境下的短文本分析
·大量的文本预处理技术需求[ 网页解析,文本抽取,正则表达式等 ]
·情感分析的特殊性
·文本长度相对较短
·语境比较独特
·需要提取的信息量较为特别(·否定词,歧义词可能导致明显误判·新词出现速度很快·分词很难做到尽善尽美)
# 1.基于词袋模型的分析 数据概况: 抓取自购物网站的正向、负向评论各约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
# 按照7:3的比例 生成训练集和测试集
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]
# 使用SVM建模
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)
# 2.基于分布式表达的分析
#https://zhuanlan.zhihu.com/p/422220941
基于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()
# 分词和预处理 ,生成list of list 格式
import jieba
df0["cut"] = df0[0].apply(jieba.lcut)
df0.head()
# 按照7:3的比例 生成训练集和测试集
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]
#设置word2vec模型 和词表
from gensim.models.word2vec import Word2Vec
n_dim =300 #指定向量维度,大样本量时300~500较好
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()
#情感分析模型拟合
#用转换后的矩阵拟合SVM模型
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) ))
# 保存模型
#from sklearn.externals import joblib
#joblib.dump(model_name,'filename')
#modelname =joblib.load('filename')
# 模型预测 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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。