Bigrams вместо отдельных слов в termdocument-матрице с использованием R и Rweka
Я нашел способ использования биграмм вместо единичных токенов в матрице термина-документа. Решение было поставлено здесь на stackoverflow: 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#Bigrams.
Ответы
Ответ 1
Вдохновленный комментарием Энтони, я узнал, что вы можете указать количество потоков, которые использует библиотека parallel
по умолчанию (укажите это, прежде чем вы вызовете NgramTokenizer
):
# Sets the default number of threads to use
options(mc.cores=1)
Так как NgramTokenizer
, похоже, зависает на вызове parallel::mclapply
, изменение количества потоков, похоже, обходит его.
Ответ 2
Кажется, есть проблемы с использованием RWeka с пакетом parallel. Я нашел обходное решение здесь.
Наиболее важным моментом является не загрузка пакета RWeka и использование пространства имен в инкапсулированной функции.
Итак, ваш токенизатор должен выглядеть как
BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}