65.9K
CodeProject 正在变化。 阅读更多。
Home

使用预训练的 VADER 模型进行 NLTK 情感分析

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (5投票s)

2020 年 5 月 29 日

CPOL

4分钟阅读

viewsIcon

20170

downloadIcon

102

本文是“情感分析”系列文章的第三篇,该系列文章使用 Python 和开源的自然语言工具包(NLTK)。在本文中,我们将探讨可用于实际进行 NLP 分析的技术。

如果您曾经被要求在 1-10 的评分等级上评价您的客户支持体验,那么您可能已经为净推荐值(NPS)做出了贡献。通过这种客户体验方法,您通常会寻找推荐者,即那些将他们的体验评为 9-10 分的人,因为他们是您品牌的拥护者,并且会继续购买、消费并告诉他人他们的体验。

在 NPS 的背景下,批评者是指将他们的体验评分为 0-6 分的任何人。他们不满意,并且经常通过负面口碑传播他们的不满。这些客户通常是优先联系的对象。7-8 分被认为是被动、满意和中立。

情感分析可以提供 NPS 的洞察,而无需我们的受众直接参加调查。情感分析可以通过评估人们在社交媒体或公共论坛上对您的评价来帮助您找到推荐者和批评者。

“查找自然语言处理数据” 中,我们讨论了 NLP 的文本数据集以及通过收集 Reddit 讨论中的帖子和评论来创建自定义数据集的技术。

在本文中,我们将探讨可用于实际进行 NLP 分析的技术。我们将基于 上一篇文章中收集的数据 进行扩展。

VADER 情感分析器

VADER(Valence Aware Dictionary and sEntiment Reasoner)于 2014 年开发,是一个预训练模型,它使用基于规则的值,这些值经过调整以适应社交媒体的情感。它会评估消息的文本,并提供对情感的评估,不仅包括积极和消极,还包括该情感的强度。

它使用一个可以评估的术语字典。在 GitHub 存储库中,这包括以下示例:

  • 否定词 - 改变短语含义的修饰语(“not great”)。
  • 缩写 - 否定词,但更复杂(“wasn’t great”)。
  • 标点符号 - 增强强度(“It’s great!!!”)。
  • 俚语 - 俚语词的变化,例如“kinda”、“sux”或“hella”。

它甚至能够理解首字母缩略词(“lol”)和表情符号(❤)。

评分是属于每个类别的文本比例的比率。语言不是非黑即白的,因此完全积极或完全消极的评分很少见。由于此模型已针对社交媒体进行预训练,因此它应该非常适用于用户在 Reddit 上发表的评论。

让我们首先看一个之前从 Reddit 检索到的评论示例。

Comments[116].body     # Output: 'This is cool!'

# If you haven’t already, download the lexicon
nltk.download('vader_lexicon')

# Initialize the VADER sentiment analyzer
from nltk.sentiment.vader import SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()
analyzer.polarity_scores(comments[116].body)

此分析的输出是

{'neg': 0.0, 'neu': 0.436, 'pos': 0.564, 'compound': 0.3802}

在 Reddit 上,像“This is cool!”这样的帖子是高度赞扬。

我们已经下载(nltk.download('vader_lexicon'))并导入(from nltk.sentiment.vader import SentimentIntensityAnalyzer)了 Vader 情感分析器,并使用它对收集的评论中的特定评论进行评分(analyzer.polarity_scores(comments[116].body))。

polarity_scores 的结果为我们提供了用于负面、中性、正面词汇选择的数值。**compound** 值反映了整体情感,范围从 -1(非常负面)到 +1(非常正面)。

您可以在 pydoc 页面上找到有关 NLTK 情感使用的更多信息:https://www.nltk.org/api/nltk.sentiment.html

Reddit 帖子所有评论的情感

让我们看看此帖子整体的情感,而不仅仅是单个评论。共有 119 条评论需要分析,我们将它们分成几类以进行计数。

len(comments)  # Output: 119

# Initializing a dictionary to keep tally of results
result = {'pos': 0, 'neg': 0, 'neu': 0}
for comment in comments:
    score = analyzer.polarity_scores(comment.body)
    if score['compound'] > 0.05:
        result['pos'] += 1
    elif score['compound'] < -0.05:
        result['neg'] += 1
    else:
       result['neu'] += 1

print(result)

输出是:

{'pos': 65, 'neg': 25, 'neu': 29}

我们学到的是,对于这篇帖子,评论总体上是积极的。

如果您开始使用此类模型分析自己的帖子,您可能希望向上或向下调整阈值。例如,只查看 +/- 0.5 的 compound 分数而不是 0.05 将突出更极端的观点。

您可以用这些信息做什么?如果您想优先考虑如何与社区互动,您可以查看积极的评论并给予他们认可,因为他们是您的支持者。如果您想重新赢得批评者,您可以关注负面评分,看看是否能从他们的评论中找到建设性的反馈,以改进您的产品或个性化外展工作,以解决特定的客户担忧。

后续步骤

正如您所见,我们可以从各种来源获取文本并进行快速分析,以了解积极和消极的情感。这是了解产品、服务或内容是否受欢迎的有用反馈。它还可以帮助优先安排社区参与。

下一步,我们可以考虑 “使用 VADER 进行 NLTK 情感分析的优缺点”

我们还可以通过利用机器学习方法来理解语言,将此分析项目进一步发展,并尝试改进我们在 NLTK 和机器学习方面的结果。

© . All rights reserved.