TermDocumentMatrix as.matrix использует большие объемы памяти

В настоящее время я использую пакет tm для извлечения терминов для кластеризации для обнаружения дубликатов в приличной базе данных из 25 тыс. Элементов (30 МБ), которая запускается на моем рабочем столе, но когда я пытаюсь запустить ее на своем сервере, кажется, что требуется безбожное количество времени. При ближайшем рассмотрении я обнаружил, что у меня получилось 4 ГБ подкачки, в которой используется строка apply(posts.TmDoc, 1, sum) для вычисления частот терминов. Более того, даже при запуске as.matrix на моем рабочем столе создается документ объемом 3 ГБ, см. http://imgur.com/a/wllXv

Нужно ли это только для того, чтобы сгенерировать подсчет частоты для 18-тысячных терминов для 25-тысячных элементов? Есть ли другой способ генерировать подсчет частоты, не приводя TermDocumentMatrix к матрице или вектору?

Я не могу удалить термины на основе разреженности, поскольку именно так реализован настоящий алгоритм. Он ищет термины, которые являются общими как минимум для 2, но не более 50, и групп на них, вычисляя значение сходства для каждой группы.

Вот код в контексте для справки

min_word_length = 5
max_word_length = Inf
max_term_occurance = 50
min_term_occurance = 2


# Get All The Posts
Posts = db.getAllPosts()
posts.corpus = Corpus(VectorSource(Posts[,"provider_title"]))

# remove things we don't want
posts.corpus = tm_map(posts.corpus,content_transformer(tolower))
posts.corpus = tm_map(posts.corpus, removePunctuation)
posts.corpus = tm_map(posts.corpus, removeNumbers)
posts.corpus = tm_map(posts.corpus, removeWords, stopwords('english'))

# grab any words longer than 5 characters
posts.TmDoc = TermDocumentMatrix(posts.corpus, control=list(wordLengths=c(min_word_length, max_word_length)))

# get the words that occur more than once, but not more than 50 times
clustterms = names(which(apply(posts.TmDoc, 1, sum) >= min_term_occurance  & apply(posts.TmDoc, 1, sum) < max_term_occurance))

1 ответ

Поскольку мне никогда не нужны значения частоты, я могу использовать команду findFreqTerms

setdiff(findFreqTerms(posts.TmDoc, 2), findFreqTerms(posts.TmDoc, 50))

такой же как

names(which(apply(posts.TmDoc, 1, sum) >= min_term_occurance  & apply(posts.TmDoc, 1, sum) < max_term_occurance))

но бежит рядом мгновенно

Другие вопросы по тегам