情感分析是研究人类行为和决策中不可或缺的一部分。信念、对现实世界的印象以及所做的决策,在很大程度上,都是基于他人如何看待和评价这个世界。因此,当需要做出选择时,经常会寻求他人的意见。观点及其相关概念,如情感、评价、态度和情绪,是情感分析研究的主题。
随着网络媒体的兴起和快速发展,情感分析领域也随之迅速发展。例如,调查、论坛讨论、博客、微博、Twitter和社交网络等,因为人类历史上前所未有的,拥有大量以先进结构记录的坚定信息。自21世纪中叶以来,情感分析已成为自然语言处理中最活跃的研究领域之一。
情感分析不仅在数据挖掘、网络挖掘和文本挖掘中被广泛研究,而且由于其对商业和社会的重要性,它已经从计算机科学扩展到管理科学和社会学。最近,涉及情感分析的现代活动也蓬勃发展。许多新公司应运而生,许多大企业建立了自己的内部能力。
情感分析系统在几乎所有的商业和社会领域都找到了它们的应用。情感分析,也称为意见挖掘,是研究人们对实体如产品、服务、组织、个人、问题、事件、主题及其属性的观点、情感、评价、评估、态度和情绪的领域。它代表了一个庞大的问题空间。
情感分析在Python中的应用
在Python中,有许多包可以使用不同的方法进行情感分析。在下一篇文章中,将介绍一些最受欢迎的方法和包:
Textblob的情感分析器为给定的输入句子返回两个属性:极性是一个介于[-1,1]之间的浮点数,-1表示负面情绪,+1表示正面情绪。主观性也是一个介于[0,1]之间的浮点数。主观句子通常指的是意见、情感或判断。
from textblob import TextBlob
test = TextBlob("这部电影太棒了!")
print(test.sentiment)
Textblob将忽略它不熟悉的词汇,它将考虑它能够分配极性和中点的单词和表达式,以获得最终得分。
VADER使用一系列词汇特征(例如单词),这些特征根据它们的语义方向被标记为正面或负面,以计算文本情感。VADER情感返回给定输入句子为正面、负面和中性的概率。
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()
sentence = "这部电影太棒了!"
vs = analyzer.polarity_scores(sentence)
print("{:-<65} {}".format(sentence, str(vs)))
为了简化流程,将使用酒店评论数据集,其中包含了客户对酒店住宿的意见。
from nltk.sentiment.vader import SentimentIntensityAnalyzer
from nltk.sentiment.util import *
from textblob import TextBlob
from nltk import tokenize
import pandas as pd
df = pd.read_csv('hotel-reviews.csv')
df.head()
# 数据集预览
df.drop_duplicates(subset="Description", keep="first", inplace=True)
df['Description'] = df['Description'].astype('str')
def get_polarity(text):
return TextBlob(text).sentiment.polarity
df['Polarity'] = df['Description'].apply(get_polarity)
# 使用Textblob生成情感极性和类型
df['Sentiment_Type']=''
df.loc[df.Polarity>0,'Sentiment_Type']='POSITIVE'
df.loc[df.Polarity==0,'Sentiment_Type']='NEUTRAL'
df.loc[df.Polarity<0,'Sentiment_Type']='NEGATIVE'
# Textblob情感分析图表
df.Sentiment_Type.value_counts().plot(kind='bar', title="Sentiment Analysis with Textblob")
使用Textblob后,为每个评论/描述获得了极性和情感类型。
import nltk
nltk.download('vader_lexicon')
from nltk.sentiment.vader import SentimentIntensityAnalyzer
sid = SentimentIntensityAnalyzer()
# 使用VADER生成情感极性和类型
df['scores'] = df['Description'].apply(lambda Description: sid.polarity_scores(Description))
df['compound'] = df['scores'].apply(lambda score_dict: score_dict['compound'])
df['sentiment_type']=''
df.loc[df.compound>0,'sentiment_type']='POSITIVE'
df.loc[df.compound==0,'sentiment_type']='NEUTRAL'
df.loc[df.compound<0,'sentiment_type']='NEGATIVE'
# VADER情感分析图表
df.sentiment_type.value_counts().plot(kind='bar', title="Sentiment Analysis with VADER")
使用VADER后,为每个评论/描述获得了复合和情感类型。