NRC词典应用实例——英文文本情感分析

本文在基于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()

NRC词典应用实例——英文文本情感分析_第1张图片
然后构建每种情绪对应的词典表:

#构建每种情绪的词语列表
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()

结果就会输出在指定位置的文件夹中了
在这里插入图片描述

你可能感兴趣的:(python)