Найдите частоту пользовательского слова в R TermDocumentMatrix с помощью пакета TM

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

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

Однако я хочу использовать функцию, которая говорит поиск слова "слово" и возвращает, сколько раз слово появляется в TermDocumentMatrix.

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


person George    schedule 07.05.2018    source источник


Ответы (1)


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

Вы можете сделать это (как минимум) двумя разными способами. Но все, что превращает разреженную матрицу в плотную, может использовать много памяти. Итак, я дам вам 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 
person phiver    schedule 08.05.2018
comment
извиняюсь за то, что не предоставил образцы данных, но преобразование tdm в плотную метрику и создание частотного вектора сработали. Спасибо. Можно ли искать сразу несколько итераций слов с помощью подстановочных знаков, например частота [% сырой]? Можно ли подсчитать два отдельных слова, например freq [сырая нефть, нефть]? - person George; 08.05.2018
comment
@ Джордж, я отредактировал свои ответы, включив эти 2 примера - person phiver; 08.05.2018
comment
фантастика! Последний вопрос, нужно ли мне использовать пакет RWeka для поиска биграмм и триграмм (2 или 3 последовательных слова)? или в текущей форме данных, могу ли я использовать функцию freq для поиска freq [не подходит] - person George; 08.05.2018
comment
Нет, вам не нужно использовать RWeka, если вы не хотите (экономия на зависимостях rjava). Здесь вы можете найти мой ответ, который просто использует НЛП для создания биграмм. Измените 2 на 3, и вы получите триграммы. Преимущество RWeka в том, что вы можете создать токенизатор, который выполняет биграмму и триграмму за один раз. freq [not fit] в настоящее время не существует, поскольку по умолчанию каждое слово разделяется. - person phiver; 08.05.2018
comment
Привет @phiver. как вы можете искать несколько слов с подстановочными знаками, используя функцию grep? этот синтаксис не работает. По сути, вы второй пример, но если нефть и нефть содержали подстановочные знаки freq [grep (does, names (text)), grep (align, names (text))] - person George; 09.05.2018
comment
регулярные выражения :-). использовать, например, grep (^ cru | ^ масло, .....). Проверьте некоторые учебники / веб-сайты по регулярным выражениям о том, как использовать волшебную силу регулярных выражений :-) - person phiver; 09.05.2018
comment
Для меня решение 2 (плотная матрица) не работало с моим набором данных из-за ограничений памяти. - person Jabro; 09.11.2020