本文在基于NRC词典的情感分析(含多种离散情绪)——python基础上创作,原文章对中文文本进行结巴分词,然后与词典进行匹配。在作者实际使用过程中,由于需要使用到英文的原始数据,因此,将中文文本预处理部分和后续处理部分进行更改完善,以适应英文文本。
情绪和情感词典 是由加拿大国家研究委员会(简称NRC)的专家创建,因此也称为NRC词典。该词典具有广泛的应用程序开发,可以在多种环境中使用,例如情绪分析,产品营销,消费者行为,甚至是政治活动分析。
词典中包含了多种语言的词汇情感值,其中就包括英文和中文,本文将使用英文进行实例应用。
先来看一下有哪些可用的参数:
import pandas as pd
lexion_df = pd.read_excel('F:/NRC-Emotion-Lexicon/NRC-Emotion-Lexicon-v0.92/NRC-Emotion-Lexicon-v0.92-In105Languages-Nov2017Translations.xlsx')
# 读取列标题
lexion_df.columns.tolist()
#选出我们要使用的列并查看
english_df = lexion_df[['English (en)','Positive', 'Negative','Anger','Anticipation', 'Disgust', 'Fear','Joy', 'Sadness', 'Surprise', 'Trust']]
english_df.head()
#构建每种情绪的词语列表
Positive, Negative, Anger, Anticipation, Disgust, Fear, Joy, Sadness, Surprise, Trust = [[]for i in range(10)]
for idx, row in english_df.iterrows():
if row['Positive']==1:
Positive.append(row['English (en)'])
if row['Negative']==1:
Negative.append(row['English (en)'])
if row['Anger']==1:
Anger.append(row['English (en)'])
if row['Anticipation']==1:
Anticipation.append(row['English (en)'])
if row['Disgust']==1:
Disgust.append(row['English (en)'])
if row['Fear']==1:
Fear.append(row['English (en)'])
if row['Joy']==1:
Joy.append(row['English (en)'])
if row['Sadness']==1:
Sadness.append(row['English (en)'])
if row['Surprise']==1:
Surprise.append(row['English (en)'])
if row['Trust']==1:
Trust.append(row['English (en)'])
print('词语列表构建完成')
然后针对我们想分析的文本创建文本预处理函数(针对英文文本):
用到的停用词表可直接在网络上搜索,自己存储为txt文件。
import re
import csv
import string
import nltk.stem
#创建停用词列表
def stopwordlist():
stopwords = [line.strip() for line in open('English_stop_words.txt',encoding='UTF-8').readlines()]
return stopwords
# 数据清洗,可根据需求调整
def processing(text):
lower = text.lower() # 将内容变小写
# 去除标点
# string.punctuation中包含英文的标点,我们将其放在待去除变量remove中
# 函数需要三个参数,前两个表示字符的映射,我们是不需要的。
remove = str.maketrans('','',string.punctuation)
without_punctuation = lower.translate(remove)
return without_punctuation
#创建分词函数
def seg_depart(sentence):
sentence_depart = sentence.split()
#对英文单词进行词干提取
s = nltk.stem.SnowballStemmer('english') #参数是选择的语言
cleaned_text = [s.stem(ws) for ws in sentence_depart]
#去除停用词
stopwords = stopwordlist() #创建一个停用词列表
outstr = '' #输出结果为outstr
for word in cleaned_text: #去停用词
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
return outstr
然后定义以下函数对单个句子进行情感分析:
#计算句子的各种情感词汇数量
#针对英文的以下修改
import time
def emotion_caculate(text):
positive, negative, anger, anticipation, disgust, fear, joy, sadness, surprise, trust =[0 for i in range(10)]
line = processing(text) #数据清洗
wordlist = seg_depart(line) #将句子分词并去除停用词
print(wordlist)
wordset=wordlist.split()
wordfreq = []
for word in wordset:
freq = wordlist.count(word)
if word in Positive:
positive+=freq
if word in Negative:
negative+=freq
if word in Anger:
anger+=freq
if word in Anticipation:
anticipation+=freq
if word in Disgust:
disgust+=freq
if word in Fear:
fear+=freq
if word in Joy:
joy+=freq
if word in Sadness:
sadness+=freq
if word in Surprise:
surprise+=freq
if word in Trust:
trust+=freq
emotion_info ={
'positive': positive,
'negative': negative,
'anger': anger,
'anticipation': anticipation,
'disgust': disgust,
'fear':fear,
'joy':joy,
'sadness':sadness,
'surprise':surprise,
'trust':trust,
'length':len(wordlist)}
score_list = list(emotion_info.values())
return score_list
定义以下函数,读取excel文件并逐条进行情感分析并输出:
def text_emotion():
filename='EnglishContent.xlsx' #要处理的文件所处的位置、名称
senti_array=[]
data=pd.read_excel(filename)
for i in range(0,len(data)):
text = str(data.values[i])
score = emotion_caculate(text)
senti_array.append(score)
name = ['positive', 'negative', 'anger', 'anticipation', 'disgust', 'fear', 'joy', 'sadness', 'surprise', 'trust', 'length']
result = pd.DataFrame(columns=name, data=senti_array)
result.to_excel('F:/result.xlsx') #结果输出位置及文件名
最后要运行的话,直接使用方法:
text_emotion()