web-dev-qa-db-ja.com

RとRwekaを使用したtermdocumentマトリックスの単一単語の代わりにバイグラム

用語ドキュメントマトリックスで単一のトークンの代わりにバイグラムを使用する方法を見つけました。解決策はここでstackoverflowに提起されています: Rの複数の用語のfindAssocs

アイデアは次のようになります。

library(tm)
library(RWeka)
data(crude)

#Tokenizer for n-grams and passed on to the term-document matrix constructor
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
txtTdmBi <- TermDocumentMatrix(crude, control = list(tokenize = BigramTokenizer))

ただし、最後の行でエラーが発生します。

Error in rep(seq_along(x), sapply(tflist, length)) : 
  invalid 'times' argument
In addition: Warning message:
In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'

最後の行からトークナイザーを削除すると、通常のtdmが作成されるため、問題はBigramTokenizer関数のどこかにあると思いますが、これはWekaサイトがここに示しているのと同じ例です: http://tm.r -forge.r-project.org/faq.html#Bigrams

16
ds10

Anthonyのコメントに触発されて、parallelライブラリがデフォルトで使用するスレッドの数を指定できることがわかりました(NgramTokenizerを呼び出す前に指定してください)。

# Sets the default number of threads to use
options(mc.cores=1)

NGramTokenizerparallel::mclapply呼び出しでハングしているように見えるため、スレッド数を変更することで回避できるようです。

31
brian.keng

parallelパッケージでRWekaを使用すると問題が発生するようです。回避策を見つけました ここ

最も重要な点は、RWekaパッケージをロードせず、カプセル化された関数で名前空間を使用することです。

したがって、トークナイザーは次のようになります。

BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}
5