2016-05-02 7 views
2

使用してテキスト分類のためのナイーブベイズを実装します。タイプに基づいて記事のカテゴリ(つまりビジネス、エンターテイメント)を予測するNaive Bayesアルゴリズムを構築する必要があります。は、私は2つの列を持つBBCの記事のデータセットを持っているQuanteda

私は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 

を誰がどのように洞察力を提供することができますこれを解決するには?私はまだテキスト分析とquantedaのハングを取得しています。ありがとうございました!

Here is a link to the dataset.

+0

あなたはあなたの例を行うのに十分なデータを提供しなければならない[再現性](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。おそらくあなたのデータと関係がありますが、確かに言うことは不可能であることはわかりません。 – MrFlick

+0

@MrFlick私は、.csvファイルへの直接リンクが含まれるようにポストを編集しました。私が提供すべき追加情報はありますか?これに新しい! – Matt

+0

')('を予測するための第2引数newdata' '試験class'ではなく、それはDFMであることが必要であり、これは、因子であることはできません。 '?? predict.textmodel_NB_fitted'を参照してください。あなたの最終行が 'predict(bbcNb)'であれば動作するはずですが、そうではありません。どうやら* k *> 2のときの予測方法にバグがあります。 https://github.com/kbenoit/quanteda/issuesで問題を提出してください。 –

答えて

4

文体注意点としては、あなたが別途ラベル/クラス/カテゴリをロードする必要はありません、コーパスは、その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) 

あなたがドン」第2引数をpredictに指定する必要があります。そうしないと、元のdfm全体が使用されます。

bbc_pred <- predict(bbcNb) 

最後に、予測精度を評価することができます。これは、テスト・セットにあなたのモデルのパフォーマンスの概要を与える:@ケン・ブノワが指摘したよう

library(caret) 

confusionMatrix(
    bbc_pred$docs$predicted[1781:2225], 
    all_classes[1781:2225] 
) 

しかし、二つ以上のクラスでの作業から予測を防ぐa bug in quantedaがあります。

docvars(bbc_corpus)$category <- factor(
    ifelse(docvars(bbc_corpus)$category=='sport', 'sport', 'other') 
) 

(上記のbbc_corpusからall_classesを抽出する前にこれが行われなければならないことに注意してください):それは固定されるまで、あなたのようなものを持つクラスを2値化ことができます。

+1

バグは0.9.6で修正されました。今すぐ動作します。 –

関連する問題