Python情感分析教程和高级指南

2021年11月9日15:06:55 发表评论 1,201 次浏览

我们在这个Python情感分析教程中帮助使用 Python 简化情感分析。你将学习如何使用 Python 构建自己的情感分析分类器,并了解 NLP(自然语言处理)的基础知识。

机器学习的前景在各个领域都显示出许多惊人的成果。自然语言处理也不例外,它是机器学习能够展示通用人工智能(并非完全但至少部分)在真正复杂的任务上取得一些辉煌成果的领域之一。

现在,NLP(自然语言处理)并不是一个新领域,机器学习也不是。但是这两个领域的融合是非常现代的,并且只发誓要取得进步。这是每个人(使用廉价智能手机)每天都会遇到的混合应用程序之一。例如,将“键盘词建议”纳入账户,或智能自动补全;这些都是 NLP 和机器学习融合的副产品,很自然地,这些已经成为我们生活中不可分割的部分。

Python如何进行情感分析情感分析是 NLP 领域的一个重要课题。它很容易成为该领域最热门的话题之一,因为它的相关性以及它正在解决和能够回答的业务问题的数量。在本教程中,你将以简单的方式介绍这个不那么简单的主题。你会分解它背后的所有小数学,你会研究它。在本教程结束时,你还将构建一个简单的情感分类器。具体来说,你将涵盖:

  • 从从业者的角度理解情感分析
  • 制定情感分析的问题陈述
  • 用于情感分析的朴素贝叶斯分类
  • Python情感分析实现
  • Python 案例研究
  • 情绪分析如何影响多个业务领域
  • 进一步阅读该主题

让我们开始吧。

Python情感分析教程和高级指南来源:中

什么是情感分析——从业者的观点:

从本质上讲,情感分析或情感分类属于文本分类任务的广泛类别,其中提供了一个短语或短语列表,并且你的分类器应该判断其背后的情绪是积极的、消极的还是中性的。有时,不采用第三个属性来保持它是一个二元分类问题。在最近的任务中,还考虑了“有点积极”和“有点消极”等情绪。现在让我们通过一个例子来理解。

Python情感分析示例 - 考虑以下短语:

  1. “泰坦尼克号是一部很棒的电影。”
  2. “泰坦尼克号不是一部好电影。”
  3. “泰坦尼克号是一部电影。”

这些短语对应于简短的电影评论,每个短语都传达了不同的情感。例如,第一个短语表示对电影泰坦尼克号的正面情绪,而第二个短语则认为这部电影不太好(负面情绪)。仔细看看第三个。该短语中没有这样的词可以告诉你有关它所传达的情感的任何信息。因此,这是一个中性情绪的例子。

现在,从严格的机器学习的角度来看,这项任务只不过是一项监督学习任务。你将向机器学习模型提供一堆短语(带有各自情绪的标签),并且你将在未标记的短语上测试模型。

仅仅介绍情感分析这应该是好的,但是为了能够构建情感分类模型,你还需要更多东西。让我们继续。

Python情感分析教程和高级指南来源:SlideShare

制定情感分析的问题陈述:

Python情感分析实现:在理解情感分类任务的问题陈述之前,你需要对一般文本分类问题有一个清晰的认识。让我们正式定义一个通用文本分类任务的问题。

  • 输入
    • 文件 d
    • 一组固定的类 C = {c 1 ,c 2 ,..,c n }
  • 输出:预测的类别 c∈∈ C

这里的文档术语是主观的,因为在文本分类领域。文档是指推文、短语、新闻文章的一部分、整个新闻文章、整篇文章、产品手册、故事等。这个术语背后的原因是单词,它是一个原子实体,在这种情况下很小。因此,为了表示大量的单词序列,一般使用这个术语文档。推文意味着更短的文档,而文章意味着更大的文档。

因此,一个包含 n 个标记文档的训练集看起来像:(d 1 ,c 1 ), (d 2 ,c 2 ),...,(d n ,c n )最终输出是一个学习分类器。

你做得很好!但是此时你必须要问的一个问题是文档的特征在哪里?真正的问题!稍后你会谈到这一点。

现在,让我们继续提出问题并慢慢建立情感分类背后的直觉。

Python如何进行情感分析?在进行情感分析时,你需要牢记的一个关键点是,并非短语中的所有单词都传达了该短语的情感。像“I”、“Are”、“Am”等词不会传达任何类型的情感,因此,它们在情感分类上下文中不是相关的。考虑这里的特征选择问题。在特征选择中,你尝试找出与类标签最相关的最相关特征。同样的想法在这里也适用。因此,短语中只有少数单词参与其中,识别它们并从短语中提取它们被证明是具有挑战性的任务。但别担心,你会做到的。

考虑以下电影评论以更好地理解这一点:

我喜欢这部电影!它很甜蜜,但带有讽刺意味。对话很棒,冒险场景很有趣。它设法浪漫而异想天开,同时嘲笑童话类型的惯例。我会推荐给大约任何人。我已经看过好几次了,我总是很高兴再次看到它...... ”

是的,这无疑是一篇评论,其中包含对特定电影的积极情绪。但是定义这种积极性的那些具体词是什么?

重新看一下评论。

喜欢这部电影!它很甜蜜,但带有讽刺意味。对话很棒,冒险场景很有趣。它设法浪漫异想天开,同时嘲笑童话类型的惯例。我会推荐给大约任何人。我已经看过好几次了,我总是很高兴再次看到它...... ”

你现在应该已经有了清晰的画面。上面这段文字中的粗体字是最重要的词,它们构成了文本所传达情感的积极性质。

用这些词怎么办?看起来很自然的下一步是创建类似于以下内容的表示:

Python情感分析教程和高级指南

那么上面的表示是做什么的呢?你现在已经猜到了。每行都包含一个单词及其在文档中的出现频率(从现在开始我们称其为文档)。你也想知道爱只出现过一次,但为什么出现频率是 2?嗯,这是整个评论的一部分。考虑一下,表示是针对整个审查的。

在制定情感分类任务的问题陈述时,你理解了“词袋”表示,而上述表示只不过是一种Bag-of-words表示。这可能是 NLP 中最基本的概念,也是解决任何文本分类问题的第一步。所以,请确保你理解它。

bag-of-words文档的表示不仅包含特定的单词,还包含文档中的所有unique单词及其出现频率。袋子set在这里是数学,所以根据集合的定义,袋子不包含任何重复的词。

但是对于这个应用程序,你只对前面提到的粗体词感兴趣,所以这个文档的词袋将只包含这些词。

文档不是以混乱的方式编写的。他们是吗?文档中的单词顺序至关重要。但是在情感分类的上下文中,这个序列并不是很重要。这里更重要或最重要的部分是这些词的存在。

你在词袋中找到的词现在将构建文档的特征集。因此,假设你是许多电影评论(文档)的集合,并且你已经为每个评论创建了词袋表示并保留了它们的标签(即,在这种情况下,情绪 - +ve 或 -ve)。你的训练集应如下所示:

Python情感分析教程和高级指南

这种表示也称为语料库。

这个训练集应该很容易解释——

所有行都是独立的特征向量,包含有关特定文档(电影评论)、特定单词及其情绪的信息。请注意,标签情绪通常表示为 (+, -) 或 (+ve, -ve)。此外,特征 w1, w2, w3, 34, ..., wn 是从一个词袋中生成的,并且没有必要所有的文档都包含这些特征/词中的每一个。

你将这些特征向量传递给分类器。那么,接下来我们来研究一下——用于情感分类的朴素贝叶斯分类模型。

Python情感分析教程:用于情感分析的朴素贝叶斯分类

朴素贝叶斯分类只不过是应用贝叶斯规则来形成分类概率。在本节中,你将从情感分类的上下文中学习朴素贝叶斯分类器。强烈建议你了解一些关于朴素贝叶斯分类和贝叶斯规则的介绍。相关资源如下:

但是为什么世界上有朴素贝叶斯 k-NN、决策树等等?稍后你会谈到这一点。

Python如何进行情感分析?让我们首先在情感分类的上下文中构建朴素贝叶斯分类器中通用术语的概念。你将首先查看贝叶斯规则:

  • 对于文档d和类c
Python情感分析教程和高级指南

资料来源:情绪分析

在这种情况下,该类包含两种情绪。正面和负面的。

让我们在此上下文中详细研究上图的每个术语。

  • RHS 项 P(c|d) 读作给定文档 d 的类别 c概率。该术语也称为后部
  • P(d|c) 应该是相似的。

现在,这些先验和似然是什么?此外,术语 P(d)(文档的概率);这听起来很荒谬吗?问题的宝石!现在就让我们找出答案吧!

  • 显示为先验的术语是你的原始信念,即文档的原始标签是正面还是负面(就情绪而言)。
  • 术语似然是给定类别 c 的文档 d 的概率。
  • 现在将术语后验视为通过将先验和似然相乘获得的更新规则或更新信念。
  • 但什么是归一化常数P(d)?该项除以乘法产生的结果,以确保结果可以在概率分布中呈现。

直到现在还不是最好的细节!但要坚持下去。你会发现更多的信息。但请记住,你仍在建立直觉,以便在情感分类的上下文中关联贝叶斯规则。

Python情感分析实现:让我们更详细地了解贝叶斯规则到底想做什么。下图展示了贝叶斯规则的更详细步骤:

Python情感分析教程和高级指南

资料来源:情绪分析

这里有很多未知的术语。让我们慢慢来。

让我们从 RHS 术语 c MAP 开始。它在这里表示贝叶斯规则的主要目标,即找出属于特定类别的某个文档的最大后验概率/估计。MAPMax A Posteriori希腊术语的缩写。

什么是argmax?你本来可以用的max

  • 嗯,argmax表示索引。假设 P(+|d) > P(-|d) 其中 + 和 - 分别表示正面和负面情绪。这些项 P(+|d), P(-|d) 返回一个数字量的概率。但是,你对概率不感兴趣,你感兴趣的是找出 P(+|d) 更大的类,并argmax返回它。对于 P(+|d) > P(-|d),argmax将返回+

是的,你可以去掉分母项 P(d)。这完全取决于实现。

但是我怎么知道 磷( d| c)磷(d|C) 和 磷(三)磷(C)? 这正是bag of words会派上用场的地方。但是如何?

继续阅读!

你已经知道如何将给定的文档转换为词袋表示。更重要的是,你可以使用此功能将文档表示为一组功能。所以现在,基本上术语 c MAP可以写成(忽略分母项 P(d)):

Python情感分析教程和高级指南

资料来源:情绪分析

Python情感分析示例:但是,你如何真正计算概率?让我们开始磷(三)磷(C) 第一的。

P(c) 主要关注这个问题:“这个类多久出现一次?” 假设你的文档数据集包含 60% 的正面情绪和 40% 的负面情绪。所以,磷( + ) = 0.6磷(+)=0.6 和 磷( - ) = 0.4磷(-)=0.4.

现在,你如何解释这个术语:P(x1, x2,...,xn | c)?

这样想——给定类别c,这些词(特征)出现的概率是多少。例如,假设你有 1000 个文档,而语料库中只有两个词——“good”和“awesome”。现在,在这 1000 个文档中,500 个文档被标记为正面,其余 500 个文档被标记为负面。此外,你发现在 500 个正面标记的文档中,200 个文档同时包含“好”和“很棒”(注意 P(x1,x2) 表示 P(x1 和 x2))。所以,概率 P(good,awesome | +) = 200 / 1000 = 1/5。

你想在这里提出的一个重要观点是,如果你的词汇量是 XX那么你可以制定n似然(如 P(good,awesome | +))概率,前提是你的文档包含 n 个单词。

请记住,你必须在这里计算两个类的似然概率。因此,在你总共有 2000 个单词并且每个文档平均包含 20 个单词的情况下,组合的总数将为 (2000) 20。这个数字大的离谱!如果语料库大小以百万计(这在实际情况中确实会发生)呢?

这称为贝叶斯分类器。但它只是不起作用,因为计算太多了。现在,你将研究使贝叶斯分类器成为朴素贝叶斯分类器的一些假设。

你将要研究的假设称为朴素贝叶斯独立假设。它们如下:P(x1, x2,...,xn | c)-词袋假设:假设位置无关紧要。假设一个特定的词出现在第 10 和 20 位,但有了这个假设,这意味着你只关心该词出现的频率,即 2。10 和 12 这两个数字在这里无关紧要。

-条件独立假设:这是使贝叶斯分类器朴素贝叶斯的关键假设。它指出“假设特征概率 P(x i |c j )”。仔细看看声明。这意味着 P(x 1 |c j )、P(x 2 |c j ) 等相互独立。(这并不意味着 P(x 1), P(x 2 ) 等相互独立) 现在,项 P(x1, x2,...,xn | c) 可以表示如下:Python情感分析教程和高级指南资料来源:情绪分析

因此,很自然地,n 个组合减少到Xn成倍减少(如果你的词汇量是XX并且你的文档包含 n 个单词)。在数学上定义,贝叶斯分类器简化为朴素贝叶斯分类器时如下所示:

Python情感分析教程和高级指南

资料来源:情绪分析

朴素贝叶斯有两个优点:

  • 减少参数数量。
  • 线性时间复杂度与指数时间复杂度相反。

当朴素贝叶斯分类机制应用于文本分类问题时,它被称为“多项朴素贝叶斯”分类。

现在,你很容易理解朴素贝叶斯分类器的机制,尤其是对于情感分类问题。现在,是时候实施情感分类器了。

你会用 Python 做到的!让我们开始案例研究。

Python情感分析教程:一个简单的 Python 情感分类器:

对于本案例研究,你将使用NLTK 书中介绍的离线电影评论语料库,可从此处下载。nltk提供数据集的一个版本。数据集将每个评论分类为正面或负面。你需要先按如下方式下载:

python -m nltk.downloader all

不建议从 Jupyter Notebook 运行它。尝试从命令提示符运行它(如果使用 Windows)。这将需要一些时间。所以,要有耐心。

有关 NLTK 数据集的更多信息,请务必访问此链接

Python如何进行情感分析?你将实施朴素贝叶斯,或者说使用NLTK代表自然语言工具包的多项朴素贝叶斯分类器。它是一个专门用于 NLP 和 NLU 相关任务的库,文档非常好。它涵盖了许多技术,并提供免费的数据集以及用于实验。

这是NLTK的官方网站。一定要检查一下,因为它有一些写得很好的 NLP 教程,涵盖了不同的 NLP 概念。

Python情感分析示例:下载完所有数据后,你将通过导入电影评论数据集开始from nltk.corpus import movie_reviews。然后,你将构建一个文档列表,并标有适当的类别。

# Load and prepare the dataset
import nltk
from nltk.corpus import movie_reviews
import random

documents = [(list(movie_reviews.words(fileid)), category)
              for category in movie_reviews.categories()
              for fileid in movie_reviews.fileids(category)]

random.shuffle(documents)

接下来,你将为文档定义一个特征提取器,因此分类器将知道它也应该注意数据的哪些方面。“在这种情况下,你可以为每个单词定义一个特征,指示文档中是否包含该单词。为了限制分类器需要处理的特征数量,你首先构建一个包含 2000 个最常见单词的列表。语料库”来源。然后,你可以定义一个特征提取器,用于检查给定文档中是否存在这些单词中的每一个。

# Define the feature extractor

all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = list(all_words)[:2000]

def document_features(document):
    document_words = set(document)
    features = {}
    for word in word_features:
        features['contains({})'.format(word)] = (word in document_words)
    return features

“你计算文档中所有单词的集合document_words = set(document),而不只是检查文档中的单词是否存在的原因是,检查单词是否出现在集合中比检查它是否出现在列表中要快得多”-来源.

Python情感分析实现:你已经定义了特征提取器。现在,你可以使用它来训练朴素贝叶斯分类器来预测新电影评论的情绪。要检查分类器的性能,你将在测试集上计算其准确度。NLTK 提供show_most_informative_features()了查看分类器发现哪些特征信息量最大的功能。

# Train Naive Bayes classifier
featuresets = [(document_features(d), c) for (d,c) in documents]
train_set, test_set = featuresets[100:], featuresets[:100]
classifier = nltk.NaiveBayesClassifier.train(train_set)
# Test the classifier
print(nltk.classify.accuracy(classifier, test_set))
0.71

哇!分类器能够达到 71% 的准确率,甚至无需调整任何参数或微调。这是第一次去很棒!

# Show the most important features as interpreted by Naive Bayes
classifier.show_most_informative_features(5)
Most Informative Features
       contains(winslet) = True              pos : neg    =      8.4 : 1.0
     contains(illogical) = True              neg : pos    =      7.6 : 1.0
      contains(captures) = True              pos : neg    =      7.0 : 1.0
        contains(turkey) = True              neg : pos    =      6.5 : 1.0
        contains(doubts) = True              pos : neg    =      5.8 : 1.0

“在数据集中,提及“不合逻辑”的评论的负面可能性几乎是正面的 8 倍,而提及“捕获”的评论的正面可能性大约是正面的 6 倍”-来源

现在的问题 - 为什么是朴素贝叶斯?

  • 你选择学习朴素贝叶斯是因为它的设计和开发方式。文本数据具有一些实践和复杂的特征,如果你不考虑神经网络,这些特征最适合映射到朴素贝叶斯。此外,它易于解释并且不会创建黑盒模型的概念。

朴素贝叶斯也有一定的缺点:

朴素贝叶斯的主要限制是独立预测变量的假设。在现实生活中,你几乎不可能获得一组完全独立的预测变量。

为什么情感分析如此重要?

情感分析解决了许多真正的业务问题:

  • 它有助于预测特定产品的客户行为。
  • 它可以帮助测试产品的适应性。
  • 自动完成客户偏好报告的任务。
  • 通过分析来自多个平台的电影评论背后的情绪,它可以轻松地自动化确定电影运行情况的过程。
  • 还有很多!

Python情感分析教程总结

恭喜!你已经做到了最后。NLP 是一个非常广泛和有趣的话题,它解决了一些具有挑战性的问题。具体来说,NLP 和深度学习的交集催生了一些出色的产品。它彻底改变了聊天机器人的交互方式。这份清单永无止境。

Python如何进行情感分析?本教程希望能让你在 NLP 的主要子领域之一(即情感分析)中领先一步。你涵盖了 NLP 最基本的主题之一 -词袋,然后详细研究了朴素贝叶斯分类器。你也检查了它的缺点。你使用nltk了用于 NLP 和 NLU 任务的最流行的 Python 库之一。你使用提供的电影语料库实现了一个简单的朴素贝叶斯分类器nltk。给自己鼓掌。你应得的!

如果你想从这个不起眼的开始,进一步了解一些令人惊叹的资源,接下来是一些链接:

以下参考资料用于创建本教程:

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: