在Python中实施Naive Bayes进行情感分析

朴素的贝叶斯分类器是一种着名的机器学习分类器,具有自然语言处理(NLP)和其他区域的应用。尽管其简单性,但它能够在不同的任务中实现高于平均性能,如情绪分析。今天,我们将详细阐述该模型的核心原则,然后在Python中实现。最终,我们将看到我们在2000年电影评论的数据集合。让我们开始吧!

天真的贝父

这个模型背后的数学是’如果您熟悉一些数学符号,则特别难以理解。对于那些aren的人’T,我会尽力解释一切。让我们从我们的目标开始,正确分类评论  作为  积极的 or 消极的。这些是两者 班级 每个文件所属的。

在更多的数学术语中,我们想找到 给出了一个文件的最可能类,这正是上述公式传达的内容。 C 是所有可能的类的集合, c 是其中一个课程和 d 我们目前分类的文件。我们读 p(c | d) 作为C类的概率,给定文件D.

我们可以使用众所周知的贝叶斯规则来重写这个方程,是机器学习中最基本的规则之一。由于我们希望最大化等式,我们可以删除不依赖于C类的分母。

我们分类器的重写形式自然地将其分成两部分, 可能性 和 事先的。 您可以将后者视为“给予课程的概率 c, 文档 d 属于它“和前者是”与C类文件中有文件的概率“。要进一步逐步,我们需要介绍一个假设,使这种型号为其名称。

AI时间期刊资源
你学习数据科学吗?

Check out what 图书 帮助20多个成功的数据科学家在他们的职业生涯中成长。

天真的贝叶斯假设: 鉴于C类,我们文档的个别特征的存在是 独立的 on the others.

我们认为我们的文件的每个单词都是一个功能。如果我们正式写下这一产品,我们获得:

朴素的贝叶斯假设让我们通过在课堂上调节的每个功能的概率替代P(d | c),因为它假设其独立性。

我们可以更改一次:最大化功能的日志。这纯粹是纯粹的计算,因为日志空间往往不易易于溢出和更有效。我们终止了分类器的目标的最终制定。

那么这种重新制作究竟如何帮助我们?让我们单独查看每个学期。

    • 个人电脑)  只是遇到在我们的语料库中遇到某个类的文件的概率。这通过划分级别的总数的总数来轻松计算。
  • p(w_ i | c)  是在C类文档中发生字W_I的概率。我们可以再次使用语料库中的频率来计算此功能。这将简单地是单词W_I在C类文件中发生的次数,除以类C类文件中出现的每个单词的数量。

我们可以计算我们配方中的所有条款,这意味着我们可以计算我们的测试文件的最有可能的类别!只有一个问题我们需要处理:零概率。

平滑

想象一下,您正在尝试对包含“stakendous”这个词的评论来分类,并且您的分类器’之前看过这个词。当然,概率p(w_i | c)为0,使我们的第二个术语转到负无穷大!这是NLP中的一个常见问题,但谢天谢地,它有一个简单的修复: 平滑。 该技术包括在P(W_I | C)公式中的每个计数中添加常数,具有最基本的平滑类型被称为添加 - 一个(LAPLACE)平滑,其中常数仅为1。

添加一个/拉普拉斯平滑

这解决了零概率问题,我们将在后面看到它影响模型的准确性。

执行

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

训练

在此阶段,我们向我们的分类器提供具有(优选地)文本的大语料库,表示为d,其计算计算重新计算的两个项所需的所有计数。

朴素的贝叶斯训练伪码

实现时,虽然伪代码以所有类的循环从循环开始,但我们将首先计算所有不起作用的所有内容’t依赖于循环前的C类。这是n_doc,词汇表和所有类集的情况。

辅助功能

由于计算单词计数时,我们还需要在循环之前计算它。

火车功能

在循环中,我们只需按照伪代码中给出的顺序。

    1. 首先,我们计算C类中D的文件数量。
    1. 然后我们计算对该特定类的logprior。
    1. 接下来,我们将循环与我们的词汇进行循环,以便我们可以获得C类内的单词数量的总数。
  1. 最后,我们使用Slogking计算C类的每个单词的日志似然性,以避免逐个划分的错误。

分类

完成培训后,我们拥有所有必要的值来进行预测。这将简单地组成,拍摄新(看不见)文件并计算在培训期间观察到的每个课程的概率。

分类部分的伪码

我们初始化Sums字典,我们将为每个类存储概率。我们始终将所有类的概率计算出来,因此自然而然地通过对它们进行循环开始函数。对于每个C类,我们首先添加LogPrior,是我们概率方程的第一项。第二个术语要求我们循环所有单词,并通过每个的日志似然递增当前概率。

预测实现

一旦完成了,我们只能得到我们的字典和Voilà的最大值的关键,我们有预测。我们现在准备好看到天真的贝父行动!

数据

我们将在数据集上测试我们的模型,其中1000正负1000负 电影评论。每个 文档  是A.  审查并包含一个或多个句子。

我们将数据分成了一个 培训集 含有90%的评论和a 测试集 剩下的10%。据称暗示,前者用于培训模型,我们的火车函数训练,而后者将为我们一个想法,模型推广到未看见数据。

一旦完成,我们需要某种基线可以比较我们模型的准确性,否则,我们无法真正识别它在做的好处。由于这是一个二进制分类任务,我们至少知道随机猜测应该是平均约50%的准确性。靠近这个数字的任何东西都是随意的猜测。

结果

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

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

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

eugh ..这令人失望。即使在不平滑的情况下,人们也希望在比平均水平更好地做得更好。让我们添加平滑

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

现在这是一些准确性!平滑使我们的型号足以正确分类至少4分,共分为5条评论,这是一个非常好的结果。我们还看到培训和预测,最多需要1秒钟,这是一个与2000年评论的数据集的运行时相对较低。

结论

正如我们所看到的,即使是天真贝叶斯算法的非常基本的实现也可能导致情感分析任务的令人惊讶的良好结果。请注意,此模型本质上是二进制分类器,这意味着它可以应用于我们有两类的任何数据集。基于情感的比特币交易,有各种应用,范围从垃圾邮件检测到比特币交易。精度为82%,真的有很多你可以做的,你需要的只是一个标签的数据集,当然,它越大,更好!

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

谢谢阅读。


相关文章:

  1. 使用基本ML算法创建聊天栏 - 第1部分

贡献者

MSC人工情报学生

贡献者表达的意见是他们自己的意见。

关于Filip Knyszewski.

MSC人工情报学生

查看Filip Knyszewski的所有帖子→