用語ドキュメントマトリックスで単一のトークンの代わりにバイグラムを使用する方法を見つけました。解決策はここで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 。
Anthonyのコメントに触発されて、parallel
ライブラリがデフォルトで使用するスレッドの数を指定できることがわかりました(NgramTokenizer
を呼び出す前に指定してください)。
# Sets the default number of threads to use
options(mc.cores=1)
NGramTokenizer
はparallel::mclapply
呼び出しでハングしているように見えるため、スレッド数を変更することで回避できるようです。
parallelパッケージでRWekaを使用すると問題が発生するようです。回避策を見つけました ここ
最も重要な点は、RWekaパッケージをロードせず、カプセル化された関数で名前空間を使用することです。
したがって、トークナイザーは次のようになります。
BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}