[英]Implementing Naive Bayes for text classification using 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)
直到predict()似乎可以正常工作,它給出:
Error in newdata %*% log.lik :
requires numeric/complex matrix/vector arguments
誰能提供解決方法的見解? 我仍然無法理解文本分析和Quanteda。 謝謝!
作為風格上的注釋,您不需要單獨加載標簽/類/類別,語料庫會將它們作為其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')
)
(請注意,這必須在從上面的bbc_corpus
提取all_classes
之前完成)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.