r - 使用 Quanteda 实现朴素贝叶斯进行文本分类

标签 r quanteda

我有一个包含两列的 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

任何人都可以提供有关如何解决此问题的见解吗?我仍在掌握文本分析和量子分析的窍门。谢谢你!

Here is a link to the dataset.

最佳答案

作为风格注释,您不需要单独加载标签/类/类别,语料库会将它们作为其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/

相关文章:

r - 在 kable kableExtra latex 输出中添加\label{}

r - 使用 Quanteda 语料库识别名词

r - 将 dfmSparse 从 Quanteda 包转换为 R 中的数据框或数据表

删除粘在类标记的 quanteda 对象的单词上的数字

R:使用 Quanteda 包进行情感分析 - 组不起作用 -> 错误:组必须具有长度 ndoc(x)

R ggplot2 : how do I plot an implicit function (contour line at just one level)?

r - 将行中的值除以最近的最大值

r - 如何在 R 中读取单行 .txt 数据集?

R/Shiny 图不显示在浏览器中

r - 如何用第一个解决方案初始化第二个手套模型?