通过数据注释改进 NLTK 情感分析





5.00/5 (3投票s)
本文是情感分析系列文章中的第六篇,该系列文章使用 Python 和开源的自然语言工具包 (NLTK)。在本文中,我们将探讨标注我们自己数据集的过程。
本情感分析系列文章的目的是使用 Python 和开源自然语言工具包 (NLTK) 构建一个库,该库可以扫描 Reddit 帖子的回复,并检测发帖者是否使用了消极、敌对或其他不友好的语言。
- 第一部分 - 使用 Python 介绍用于自然语言处理的 NLTK
- 第二部分 - 寻找用于自然语言处理的数据
- 第三部分 - 使用预训练的 VADER 模型进行 NLTK 情感分析
- 第四部分 - 使用 VADER 进行 NLTK 情感分析的优缺点
- 第五部分 - NLTK 和机器学习在情感分析中的应用
- 第六部分 - 通过数据标注改进 NLTK 情感分析
- 第七部分 - 使用云 AI 进行情感分析
Python 的自然语言工具包 (NLTK) 自然语言处理 (NLP) 库是一个强大的工具,可用于对数据语料库进行文本分析。
在文章《使用预训练的 VADER 模型进行 NLTK 情感分析》和《NLTK 与机器学习在情感分析中的应用》中,我们使用了一些预配置的数据集和分析工具,对从 Reddit 讨论中提取的数据体进行情感分析。
从根本上说,如果我们关注像 r/learnpython subreddit 这样的技术社区,电影评论可能不是一个好的训练语料库。如果我们继续迭代和改进我们正在寻找的特征,在移至 r/Movies 或 r/MovieDetails subreddit 等社区的数据进行评估时,我们可能会获得良好的结果。
过拟合发生在当您拥有太多专门针对训练数据进行调整但无法泛化的特征时。我们可能能够提高预测电影评论的准确性,但这与我们的目标用例不太匹配。
我们可以使用 UCI 论文评论集这样的数据集,它可能包含具有预测性的技术和科学术语,但该数据集是西班牙语的,因此可能无法泛化。
我们可以使用路透社新闻文章集这样的数据集,但陈述事实和新闻的风格不涉及技术社区可能使用的相同词汇,因此它与电影评论存在同样的问题。
相反,让我们看看标注我们自己数据集的过程。
创建自定义数据集进行训练
为了不使 Reddit API 过载,我们在训练期间将暂时进行一些缓存。
# reddit, submission, and comments were defined as in
# earlier code listing
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import json
results = {}
analyzer = SentimentIntensityAnalyzer()
for comment in comments:
score = analyzer.polarity_scores(comment.body)
results[comment.id] = {
'score': score,
'ups': comment.ups,
'downs': comment.downs,
'created': comment.created,
'text': comment.body
}
if comment.author:
results[comment.id]['author'] = comment.author.name
else:
results[comment.id]['author'] = 'deleted'
# Store results in a file for annotation
filename = submission.id + '.json'
with open(filename, 'w') as file:
json.dump(results, file, indent=4)
这将为我们提供一个包含一些可能对定义特征有用的值的数据文件。
现在是标注的时候了。我们可以编辑此文件或创建映射来添加我们自己的标签,如下面的红色所示。
{
"fmonppi": {
"score": {
"neg": 0.0,
"neu": 0.981,
"pos": 0.019,
"compound": 0.1779
},
"ups": 122,
"downs": 0,
"created": 1586293145.0,
"author": "...",
"text": "To take a non programming approach, suppose you and I both have a $50 bill. They are of equal value but are not the same as their serial numbers differ.\n\nSo they are equivalent but not identical.\n\nIn Python, == checks for equivalency. For custom classes you can implement this yourself. In contrast, is and is not checks to see if two things are identical. Generally it's used to check if two variable names are aliases of each other and to check for None as there is only NoneType instance.",
"label": "neutral",
},
...
}
我们可以查看此帖子的每个评论,并以我们认为有用的方式对其进行标注。例如,我同意 VADER 分析,认为此评论应为中性。
许多情感分析数据集仅指定正面和负面,这会将中性评论强制归入其中一个分类选项,这在尝试识别真正富有洞察力的评论时可能是一种损害。
我们可以构建工具来帮助自动化标注工作流程。我们不会详细介绍这些工具,但无论我们使用 CLI 还是 GUI,我们都可以选择强行给所有评论添加一个标签,或者在多个集合中进行随机抽样,并随着时间的推移定期增长我们的数据集。
使用自定义标注数据集进行训练
有了我们自己的标注数据集,我们现在可以在训练尝试中将其替换掉现成的电影评论语料库。和以前一样,我们将文本的一些详细信息与我们自己选择的标签配对。与电影评论不同,我们不是同时阅读类似标注的内容,但我们仍然随机化,以防评论的顺序有任何意义。
# return a list of tuple pairs
# details about a comment
# a string label for 'positive', 'negative', and 'neutral'
def get_labeled_dataset():
filename = 'annotated.json'
with open(filename, 'r') as file:
annotated = json.loads(file.read())
dataset = []
for id in annotated:
dataset.append((annotated[id], annotated[id]['label']))
random.shuffle(dataset)
return dataset
我们对我们的 get_features()
方法没有进行任何实质性更改,只是将文本直接传递给函数,我们需要从 comment['text']
中检索。
有效特征分析的注意事项
为了改进我们的分析,我们需要构建一个语料库。标注单个帖子不算太糟糕,但我们的电影评论数据集有 2000 条,而单个 Reddit 帖子可能只有 100 条评论。(我们在《查找自然语言处理数据》中讨论了从 Reddit 收集评论。)
尽管样本量很小,但标注我们自己数据的努力可以帮助我们理解什么能带来更好的预测。
VADER 分析仍然是我们特征集的一部分,因为它为我们提供了一个良好的基准。VADER 值范围从 -1 到 +1,我们需要选择一个阈值,在此之上和之下分配正面和负面情绪。通过将分数与我们的机器学习方法相结合,我们可以通过在分类模型中使用权重来确定该阈值。
这里的核心概念最初是理解评论中的客户情绪,我们的数据来源是 r/learnpython subreddit 中的评论。还有哪些特征有助于理解技术社区的情绪?
- Reddit 使用点赞和点踩的数量来区分有争议的帖子和评论。这对我们也一样。同时获得大量点赞和点踩的帖子往往是极度正面或负面的。
- 对于技术受众,可以通过证明某人某事是错误的来推断出许多措辞可能带有负面含义。这包括诸如“不正确”、“更好的解释”、“我将避免它”、“你搞反了”、“这种行为是晦涩的”、“强烈不建议”等短语。
- 感激是正面情绪的一个好迹象,包括“谢谢”和“太棒了”等短语。
- 以“嗯,”或“也许”开头一个句子通常表示该评论可能被解释为负面的。
- 词汇方法可能会忽略与技术社区相关的其他细节,例如当评论使用源代码或引用外部参考(如 URL)时(这可以被视为一个增强器,用于帮助某人,或指出未遵循的 Python Enhancement Proposal (PEP) 建议)。
- 理解何时提出反问句。
最终,标签是主观的,反映了我们自己的偏见和对数据的兴趣。为了获得最准确的结果,我们应该努力在标签上保持一致,并在如何对这些观察结果进行特征标记方面保持一致。
后续步骤
如果您已经阅读了我们关于 NLTK 和情感分析的文章,您应该对使用内置的 Python NLTK 工具和您自己的机器学习模型进行自然语言处理的主要构建块有基本的了解。
在《使用云 AI 进行情感分析》中,我们将探讨一些现在通过 Amazon Comprehend 和 Microsoft Azure Text Analytics 等云计算服务提供的复杂 NLP 工具。