Найти частоту произвольного слова в R TermDocumentMatrix с помощью пакета TM - PullRequest
0 голосов
/ 08 мая 2018

Я превратил около 50 000 строк данных varchar в корпус, а затем приступил к очистке указанного корпуса с использованием пакета TM, получая набор стоп-слов, знаков препинания и чисел.

Затем я превратил его в TermDocumentMatrix и использовал функции findFreqTerms и findMostFreqTerms для запуска анализа текста. findMostFreqTerms возвращает общие слова и количество раз, которое они отображаются в данных.

Тем не менее, я хочу использовать функцию, которая говорит, что искать «слово» и возвращать, сколько раз «слово» появляется в TermDocumentMatrix.

Есть ли функция в ТМ, которая достигает этого? Должен ли я изменить свои данные на data.frame и использовать другой пакет и функцию?

1 Ответ

0 голосов
/ 08 мая 2018

Поскольку вы не привели воспроизводимый пример, я приведу его, используя набор данных crude, доступный в пакете tm.

Вы можете сделать это (как минимум) 2 разными способами. Но все, что превращает разреженную матрицу в плотную матрицу, может использовать много памяти. Поэтому я дам вам 2 варианта. Первый из них более дружественный к памяти, так как использует разреженную матрицу TDM. Второй, сначала преобразует TDM в плотную матрицу, прежде чем создать вектор частоты.

library(tm)
data("crude")
crude <- as.VCorpus(crude)
crude <- tm_map(crude, stripWhitespace)
crude <- tm_map(crude, removePunctuation)
crude <- tm_map(crude, content_transformer(tolower))
crude <- tm_map(crude, removeWords, stopwords("english"))


tdm <- TermDocumentMatrix(crude)

# Making use of the fact that a tdm or dtm is a simple_triplet_matrix from slam
my_func <- function(data, word){
  slam::row_sums(data[data$dimnames$Terms == word, ])
}

my_func(tdm, "crude")
crude 
   21 
my_func(tdm, "oil")
oil 
 85

# turn tdm into dense matrix and create frequency vector. 
freq <- rowSums(as.matrix(tdm))
freq["crude"]
crude 
   21 
freq["oil"]
oil 
 85 

редактирование: По запросу в комментарии:

# all words starting with cru. Adjust regex to find what you need.
freq[grep("^cru", names(freq))]
crucial   crude 
      2      21 

# separate words
freq[c("crude", "oil")]
crude   oil 
   21    85 
...