使用朴素贝叶斯算法进行文档分类

机器算法验证 r 贝叶斯 分类 文本挖掘
2022-04-19 09:16:38

我想使用朴素贝叶斯方法在 R 中构建一个文档分类器。

以下是我到目前为止所做的步骤:

  • 我有来自 2 个作者的大约 30 个文档的语料库(类别是:“目标作者”和“其他作者”)。
  • “词汇”(训练集)已经过预处理(删除了数字、删除了标点符号、单词转小写、删除了停用词、词干文档、去除空格),我只考虑常用词(前 700 个)。
  • 现在我的矩阵看起来像:

    在此处输入图像描述

然后我使用一些现有的 R 库e1071使用贝叶斯训练了我的分类器。

以下是我的问题:

我想在不属于训练集的其他文档上测试我的分类器。

  • 如何准备我的数据矩阵?如果那些其他文档不包含我的训练集中的所有单词(属性)怎么办?我应该在那里放置虚拟列(例如,使用value=0)吗?
  • 单词的位置(列顺序)重要吗?

这是一个例子:

训练属性:

"wild"  "wind"  "woman"

测试属性:

"woman" "wind" "wild"  

这可以吗,还是应该列与训练矩阵中的顺序相同?

3个回答

您应该仅基于您的训练集来构建您的特征(在这种情况下,您作为每个文档的描述符包含的单词)。这将计算某个单词属于特定类别的概率:P(wi|ck). 如果您想知道,在计算文档属于某个类的概率时需要此概率:P(ck|document)

当您要预测测试集中的新文档的类别时,请忽略未包含在训练集中的单词。原因是除了测试您的预测之外,您不能将测试集用于其他任何事情。此外,训练集必须代表测试集。否则,你不会得到一个好的分类器。因此,可以预期测试集中的大部分单词也包含在训练集中。

有些人为未知单词添加了一个额外的列,并尝试计算给定某个类的此类单词的概率:P(unknown|ci). 我认为这没有必要甚至不合适,因为为了获得这个概率,您需要查看测试集。那是你绝对不能做的事情。

您可以先过滤停用词和其他无意义的常用词,然后您可以尝试一些较小的数量并检查它是如何工作的。一般来说,如果你在你的集合中使用大量的词,它们中的大部分将是纯噪声,不会携带太多信息。做几次尝试并检查什么速率是足够的,但是只预测两个类别,我想你可以使用更少的数量。

缺字怎么办?它们不会发生,因此它们的频率为零。另一方面,朴素贝叶斯大量使用产品,如果你将任何东西乘以零,你就会得到零。在大多数(可能是所有)行中,您将有一些未出现的单词,因此您的矩阵将成为零的集合。因此,最好选择一些任意小的数字并将其添加到矩阵中的所有值中,这样就不会有零(大多数现成的算法都会为您执行此操作)。

矩阵中单词的位置无关紧要。但是,文本中单词的位置可能很重要,因此您可以在分析中包含这样的变量(但这超出了简单使用朴素贝叶斯算法的范围)。

最后的一般评论:非常注意清理和预处理数据,因为它在 NLP 中至关重要,请记住:垃圾输入,垃圾输出决定在你的训练集中包含哪些单词也是重要的一步——采取“topn单词”在许多情况下可能是不够的。

变量的顺序不是问题。我猜您使用的是实际标记作为变量,然后随机森林或 svm 或任何其他模型可以理解使用变量名称。问题可能是当您在测试数据中没有某些标记时,您可能需要引入虚拟值