我有一个包含两列的 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)
它似乎工作顺利,直到预测(),它给出:
Error in newdata %*% log.lik :
requires numeric/complex matrix/vector arguments
任何人都可以提供有关如何解决此问题的见解吗?我仍在掌握文本分析和量子分析的窍门。谢谢你!
最佳答案
作为风格注释,您不需要单独加载标签/类/类别,语料库会将它们作为其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 指出的那样,有 a bug in quanteda这会阻止预测与两个以上的类一起使用。在此问题解决之前,您可以使用以下方法对类进行二值化:
docvars(bbc_corpus)$category <- factor(
ifelse(docvars(bbc_corpus)$category=='sport', 'sport', 'other')
)
(请注意,必须在从上面的 bbc_corpus
中提取 all_classes
之前完成此操作)。
关于r - 使用 Quanteda 实现朴素贝叶斯进行文本分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36974772/