Биграммы вместо отдельных слов в матрице термодокументов с использованием R и Rweka

Я нашел способ использовать биграммы вместо отдельных токенов в матрице терм-документа. Решение было поставлено на стеке потока здесь: findAssocs для нескольких терминов в R

Идея звучит примерно так:

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.

2 ответа

Вдохновленный комментарием Энтони, я обнаружил, что вы можете указать количество потоков, которые parallel библиотека использует по умолчанию (укажите это перед вызовом NgramTokenizer):

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

Так как NGramTokenizer кажется висит на parallel::mclapply вызов, изменение количества потоков, кажется, работает вокруг этого.

Кажется, есть проблемы с использованием RWeka с параллельным пакетом. Я нашел обходное решение здесь.

Наиболее важным моментом является не загрузка пакета RWeka и использование пространства имен в инкапсулированной функции.

Так что ваш токенизатор должен выглядеть

BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}
Другие вопросы по тегам