簡體   English   中英

使用Quanteda實現朴素貝葉斯文本分類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM