【问题标题】:Implementing Naive Bayes for text classification using Quanteda使用 Quanteda 为文本分类实现朴素贝叶斯
【发布时间】:2016-08-26 18:22:25
【问题描述】:

我有一个包含两列的 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 的窍门。谢谢!

Here is a link to the dataset.

【问题讨论】:

  • 您应该提供足够的数据来制作您的示例reproducible。它可能与您的数据有关,但由于我们无法确定,因此无法确定。
  • @MrFlick 我已编辑帖子以包含指向 .csv 文件的直接链接。我应该提供任何其他信息吗?新手!
  • newdata predict() 的第二个参数不能是一个因素,test class 是,而是它需要是一个 dfm。见??predict.textmodel_NB_fitted。如果您的最后一行是 predict(bbcNb) 应该可以工作 - 但不能。显然 k >2 时 predict 方法中存在错误。请在github.com/kbenoit/quanteda/issues 提出问题。
  • 感谢@KenBenoit!如果我想保留predict() 的newdata 参数,那么转换testclass 的正确方法是什么?会是testclass_dfm &lt;- dfm(as.matrix(testclass)) 吗?这样做会在使用predict() 时出现以下错误:“newdata %*% log.lik 中的错误:文件 ../MatrixOps/cholmod_sdmult.c 第 90 行中的 Cholmod 错误‘X 和/或 Y 尺寸错误’”跨度>

标签: r quanteda


【解决方案1】:

作为一种风格说明,您不需要单独加载标签/类/类别,语料库会将它们作为其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 之前完成)。

【讨论】:

  • 在 0.9.6 中修复了错误。现在可以使用了。
猜你喜欢
  • 2015-02-18
  • 2016-08-02
  • 2018-07-29
  • 2014-04-14
  • 2013-12-02
  • 2012-04-09
  • 2019-01-22
  • 2015-03-06
  • 2013-12-24
相关资源
最近更新 更多