2

我正在尝试在 python 中使用 VADER 确定客户反馈的情绪分数。下面的简单代码非常适合个人反馈,并返回一个包含负面、中性、正面和复合分数的字典。

代码:

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer


feedback = "Food was very good"
vader = SentimentIntensityAnalyzer()
sentiment = vader.polarity_scores(feedback)

print(sentiment)

结果:{'neg':0.0,'neu':0.484,'pos':0.516,'compound':0.4927}

现在,我有一个包含 4k+ 客户反馈的电子表格。我要做的是遍历每个反馈并添加 4 个新列作为 Negative_Score、Neutral_Score、Positive_Score 和 Compound_Score。我编写了以下代码,但没有给出预期的结果。每行获得相同的分数。任何帮助将不胜感激。

代码:

    import os.path
    from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
    import pandas as pd

    data = pd.read_excel(r"C:\...\sample_feedback.xlsx") 
    #Sample_feedback.xlsx has two col customer and feedbacktext
    vader = SentimentIntensityAnalyzer()
    data["Negative_Score"] = vader.polarity_scores(data["feedbacktext"]).get("neg")
    data
4

1 回答 1

0

我们可以使用lambda. 它比遍历数据框行要好。我写了一个方法vader_scores,唯一的功能是从反馈文本中返回相应的极性分数(pos/neg/neu/compound)。

您的代码为所有行返回相同极性分数的主要原因是您data["feedbacktext"]单独使用了它,它占用了整个列并为其返回了结果值。我所做的是,使用行的索引从每一行中选择了数据[“feedbacktext”],并在Negative_Score , Neutral_Score, Positive_Score, and Compound_Score列中填充了它的单元格。

我使用的样本数据是:

在此处输入图像描述

这是我的代码:

import os.path
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
import pandas as pd

def vader_scores(feedbacktext, category):
    return vader.polarity_scores(feedbacktext).get(category)

data = pd.read_excel(r"sample_feedback.xls") 
# print(data)
#Sample_feedback.xlsx has two col customer and feedbacktext
vader = SentimentIntensityAnalyzer()

data["Negative_Score"] = data.apply(lambda row : vader_scores(data["feedbacktext"][row.name], "neg"),axis=1)
data["Neutral_Score"] = data.apply(lambda row : vader_scores(data["feedbacktext"][row.name], "neu"),axis=1)
data["Positive_Score"] = data.apply(lambda row : vader_scores(data["feedbacktext"][row.name], "pos"),axis=1)
data["Compound_Score"] = data.apply(lambda row : vader_scores(data["feedbacktext"][row.name], "compound"),axis=1)
data

输出是:

在此处输入图像描述

于 2021-01-25T18:36:28.720 回答