在Python中实现朴素贝叶斯用于情感分析

朴素贝叶斯分类器是众所周知的机器学习分类器,在自然语言处理(NLP)和其他领域中都有应用。尽管它很简单,但在诸如情感分析之类的不同任务中却能够获得高于平均水平的性能。今天,我们将详细介绍该模型的核心原理,然后在Python中实现它。最后,我们将看到我们在2000个电影评论的数据集上做得如何。让我们开始吧!

朴素贝叶斯

核心

该模型背后的数学是’如果您熟悉某些数学符号,将很难理解。对于那些不是你们的人’t,我会尽力彻底解释一切。让我们从目标开始,正确地对评论进行分类 如   or 。这是两个 类 每个文档所属的。

用更多的数学术语,我们想找到 给定文档的最可能的类别,这正是上述公式所传达的含义。 C 是所有可能的类的集合, c 是这些类别之一 d 我们当前正在分类的文档。我们读 P(c | d) 给定文件d作为c类的概率。

我们可以使用众所周知的贝叶斯规则重写该方程,贝叶斯规则是机器学习中最基本的规则之一。由于我们要最大化方程式,因此可以删除不依赖于c类的分母。

分类器目标的改写形式自然会将其分为两部分,即 可能性 和 先验。 您可以将后者视为“给定班级的概率 c,文件 d 属于它”,前者则为“拥有c类文件的概率”。要更进一步,我们需要引入使该模型具有名称的假设。

AI Time Journal资源
您正在学习数据科学吗?

Check out what 图书 帮助20多个成功的数据科学家成长。

朴素贝叶斯假设: 给定c类,我们文档的单个功能的存在是  独立 on the others.

我们认为文档中的每个单词都是一个功能。如果我们正式编写此代码,则可以获得:

朴素贝叶斯假设让我们用条件限定在类上的每个特征的概率乘积代替P(d | c),因为它假定了它们的独立性。

我们可以再做一个更改:改为最大化我们的函数日志。这样做的原因纯粹是计算上的,因为对数空间趋向于不易发生下溢,而效率更高。我们得出分类器目标的最终表述。

那么,这种重新制定究竟对我们有何帮助?让我们分别查看每个术语。

    • P(c) 只是碰到我们语料库中某个类别的文档的概率。只需将c类的出现次数除以文档总数即可轻松计算得出。
  • P(w_i| c) 是单词w_i在c类文档中出现的概率。同样,我们可以使用语料库中的频率进行计算。这仅是单词w_i在c类文档中出现的次数除以出现在c类文档中的每个单词的计数之和。

我们可以计算公式中的所有术语,这意味着我们可以计算测试文档中最可能的类别!我们只需要处理一个问题:零概率。

平滑处理

想象一下,您正在尝试对包含“ stupendous”一词的评论进行分类,而您的分类器还没有’以前没看过这个词。自然,概率P(w_i | c)将为0,从而使方程式的第二项变为负无穷大!这是NLP中的一个常见问题,但幸运的是,它很容易解决: 平滑。 该技术包括在P(w_i | c)公式中的每个计数上添加一个常量,最基本的平滑类型称为加一(Laplace)平滑,其中常量仅为1。

加一/拉普拉斯平滑

这解决了零概率问题,稍后我们将看到它对模型精度的影响有多大。

实作

我们将以NaiveBayesClassifier类的形式实现分类器。我们将算法分为两个基本部分, 训练 and 分类。 

训练

在此阶段,我们为分类器提供一个(最好是)大型文本语料库,表示为D,该语料库计算出计算重新计算的两个项所必需的所有计数。

朴素贝叶斯训练的伪代码

在实现时,尽管伪代码以遍历所有类的循环开头,但我们将从计算不存在的所有内容开始’t取决于循环之前的类c。 N_doc,词汇表和所有类的集合就是这种情况。

辅助功能

由于计算字数时需要bigdoc,因此我们也要在循环之前进行计算。

火车功能

在循环内,我们仅遵循伪代码中给出的顺序。

    1. 首先,我们计算c类中来自D的文档数。
    1. 然后,我们计算该特定类的对数。
    1. 接下来,我们对词汇进行循环,以便获得c类中单词总数的总数。
  1. 最后,我们使用平滑来计算类c的每个单词的对数似然,以避免除零错误。

分类

训练完成后,我们将掌握所有必要的值以进行预测。这将仅包括获取一个新的(看不见的)文档并计算在培训期间已观察到的每个班级的概率。

分类部分的伪代码

我们初始化sums字典,在其中存储每个类的概率。我们总是计算所有类的概率,因此自然而然地,函数是通过对它们进行循环来开始的。对于每个c类,我们首先添加对数优先级,即概率方程的第一项。第二项要求我们遍历所有单词,并通过每个单词的对数似然来增加当前概率。

预测实施

完成此操作后,我们就可以获取字典和voilà的最大值的键,我们便有了预测。现在,我们可以看到朴素贝叶斯在行动!

数据

我们将在具有1000个正数和1000个负数的数据集上测试模型 电影评论。每 文件 是一个 评论,由一个或多个句子组成。

我们将数据分成一个 训练集 包含90%的评论和 测试集 剩下的10%。顾名思义,前者用于通过我们的训练函数来训练模型,而后者将使我们了解模型如何很好地推广到看不见的数据。

完成此操作后,我们需要某种基准来与模型的准确性进行比较,否则,我们无法真正判断模型的性能如何。由于这是一个二进制分类任务,因此我们至少知道随机猜测平均可以为我们带来约50%的准确性。接近此数字的任何事物本质上都是随机猜测。

结果

让我们从头到尾看一下算法的完整实现。

对,就是那样!我们要做的就是创建分类器,对其进行训练,然后使用验证集检查其准确性。我省略了帮助函数来创建用于训练和验证的集合和标签。通过将alpha设置为0并运行它,来看看我们的模型如何在不进行平滑的情况下运行

Predicted correctly 101 out of 202 (50.0%)
Ran in 1.016 seconds

恩..令人失望。即使不进行平滑处理,人们也会希望至少比平均水平稍好一些。让我们添加平滑

Predicted correctly 167 out of 202 (82.67327%)
Ran in 0.961 seconds

现在,这有些准确性!平滑处理使我们的模型足够好,可以正确地对5条评论中的至少4条进行分类,这是一个非常不错的结果。我们还看到,训练和预测两者合计最多花费1秒,这对于具有2000条评论的数据集来说是相对较低的运行时间。

结论

如我们所见,即使是朴素贝叶斯算法的非常基本的实现,也可以为情感分析任务带来令人惊讶的良好结果。请注意,此模型本质上是一个二进制分类器,这意味着它可以应用于我们具有两个类别的任何数据集。它有各种各样的应用程序,从垃圾邮件检测到基于情感的比特币交易。准确率达到82%,实际上您可以做很多事情,您所需要的只是一个标记数据集,当然,数据集越大越好!

如果您对AI感兴趣,请随时查看我的GitHub: //github.com/filipkny/MediumRare。我将把源代码和那里的数据放在一起,以便您自己进行测试。

感谢您的阅读。


相关文章:

  1. 使用基本的ML算法创建ChatBot-第1部分

贡献者

理学硕士人工智能学生

贡献者表达的观点是他们自己的观点。

关于菲利普·克尼斯维斯基

理学硕士人工智能学生

查看Filip Knyszewski的所有帖子→