NLP基础:情感分析

情感分析

·最常用于微博、微信、用户论坛等语境下的短文本分析
·大量的文本预处理技术需求[ 网页解析,文本抽取,正则表达式等 ]
·情感分析的特殊性
    ·文本长度相对较短
    ·语境比较独特
    ·需要提取的信息量较为特别(·否定词,歧义词可能导致明显误判·新词出现速度很快·分词很难做到尽善尽美)

# 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)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值