2

我有一个包含两列的 BBC 文章数据集:“类别”和“文本”。我需要构建一个朴素贝叶斯算法,根据类型预测文章的类别(即商业、娱乐)。

我正在尝试使用 Quanteda 并具有以下代码:

library(quanteda)

bbc_data <- read.csv('bbc_articles_labels_all.csv')
text <- textfile('bbc_articles_labels_all.csv', textField='text')
bbc_corpus <- corpus(text)
bbc_dfm <- dfm(bbc_corpus, ignoredFeatures = stopwords("english"), stem=TRUE)


# 80/20 split for training and test data
trainclass <- factor(c(bbc_data$category[1:1780], rep(NA, 445)))
testclass <- factor(c(bbc_data$category[1781:2225]))

bbcNb <- textmodel_NB(bbc_dfm, trainclass)
bbc_pred <- predict(bbcNb, testclass)

它似乎工作顺利,直到 predict(),它给出:

Error in newdata %*% log.lik : 
  requires numeric/complex matrix/vector arguments

谁能提供有关如何解决此问题的见解?我仍然掌握文本分析和 quanteda 的窍门。谢谢!

这是数据集的链接。

4

1 回答 1

4

作为文体说明,您不需要单独加载标签/类/类别,语料库会将它们作为其之一docvars

library("quanteda")

text <- readtext::readtext('bbc_articles_labels_all.csv', text_field='text')
bbc_corpus <- corpus(text)
bbc_dfm <- dfm(bbc_corpus, remove = stopwords("english"), stem = TRUE)

all_classes <- docvars(bbc_corpus)$category
trainclass <- factor(replace(all_classes, 1780:length(all_classes), NA))
bbcNb <- textmodel_nb(bbc_dfm, trainclass)

您甚至不需要为predict. 如果不这样做,它将使用整个原始 dfm:

bbc_pred <- predict(bbcNb)

最后,您可能想要评估预测的准确性。这将为您提供模型在测试集上的性能摘要:

library(caret)

confusionMatrix(
    bbc_pred$docs$predicted[1781:2225],
    all_classes[1781:2225]
)

然而,正如@ken-benoit 所指出的,quanteda 中存在一个错误,该错误会阻止预测与两个以上的类一起工作。在修复之前,您可以使用以下内容对类进行二值化:

docvars(bbc_corpus)$category <- factor(
    ifelse(docvars(bbc_corpus)$category=='sport', 'sport', 'other')
)

(请注意,这必须在您all_classesbbc_corpus上面提取之前完成)。

于 2016-05-05T10:55:33.637 回答