用于多标签文本分类的朴素贝叶斯

数据挖掘 多标签分类 朴素贝叶斯分类器
2021-10-09 13:03:09

如何在 R 中使用朴素贝叶斯进行多标签文本分类。

我尝试使用 e1071 库中的 naiveBayes() ,但似乎在训练时,它不接受多标签类变量。

我使用文本文档语料库创建了 TermDocumentMatrix,并尝试使用此矩阵和类变量(特定文档所属的主题列表)创建模型。下面是我使用的代码。

trainvector <- as.vector(traindata$bodyText)

trainsource <- VectorSource(trainvector)

traincorpus <- Corpus(trainsource)

trainmatrix <- t(TermDocumentMatrix(traincorpus))

model <- naiveBayes(as.matrix(trainmatrix), as.factor(traindata$topics))

最后一行给出以下错误:

Error in sort.list(y) : 'x' must be atomic for 'sort.list'

您是否在列表中调用了“排序”?

我尝试使用

model <- naiveBayes(as.matrix(trainmatrix), as.factor(unlist(traindata$topics)))

但出现错误:

Error in tapply(var, y, mean, na.rm = TRUE) : 
  arguments must have same length
1个回答

因为通常,大多数库实现的朴素贝叶斯算法不支持多标签分类。尽管您可以从朴素贝叶斯方法中汲取灵感来设计自己的算法。

对于特定的类 c 和文档 d(包含 3 个单词 w1、w2、w3)

'/' 代表'给定' p(a/b) = 概率(a given b)

根据贝叶斯定理。

p(c/d) = p(c,d) / p(d)

p(c/d) = (p(c)*p(d/c)) / p(d)

在哪里:

p(d/c) = p(w1/c)*p(w2/c)*p(w3/c)

因为假设单词是相互独立的。

并且 p(w1/c) 可以使用您的代码获得,计算 c 类文档中 w1 的计数除以所有文档中 w1 的总数,或者您可以使用自己的逻辑

但是如果想避免写详细的代码

您可以重组输入数据以实现多标签分类。这样具有 n 个标签/类的给定文档 d(例如,用 c1、c2、c3 标记的 d)被扩展为每次具有不同标签的同一文档 d 的 n 个样本(此处为 3 个)的数据((d,c1),( d,c2),(d,c3))。现在您可以将此数据传递到任何支持多项式朴素贝叶斯的 R/python 库中。同样需要在您的数据集中完成。目前,您正在传递 traindata$topics,它是 y 变量(训练标签),无需修改。

即使在您使用这种方法训练数据之后。您需要使用概率阈值,例如 0.2,以便将概率高于 0.2 的类标签分配给该测试文档。

更好的方法,需要重组你的输入

如果您有“n”个类标签,那么您可以为每个类训练“n”个不同的二进制朴素贝叶斯分类器。例如,为了训练“c1”类的分类器,您可以训练一个带有因变量 Y 的朴素贝叶斯分类器,将该文档上的类 c1 的存在表示为“1”,而将不存在表示为“0”。

在使用这种方法训练“n”二元朴素贝叶斯分类器之后。您现在将使用这 n 个分类器的输出。例如,如果其中有 n 个分类器,如果对应于类“c1”的特定分类器的输出概率高于 0.5,则将类标签“c1”分配给该测试文档。