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))
но бежит рядом мгновенно