Недавно я создал функцию, которая может подсчитывать частоту появления определенных ключевых слов в документе с параллельной обработкой.
Теперь я хотел бы настроить код так, чтобы он учитывал не то, сколько раз все ключевые слова появляются в документах, а вместо этого, сколько ключевых слов появляется в документе.
Воспроизводимый пример:
keywords <- c("Toyota", "Prius", "BMW", "M3")
documents <- c("New Toyota Prius for sale, the Toyota Prius is in good condition","BMW M3 that drives like a Toyota but is a BMW")
count_strings <- function(x, words){sum(unlist(strsplit(x, ' ')) %in% words)}
library(parallel)
mcluster <- makeCluster(detectCores())
number_of_keywords <- parSapply(mcluster, documents, count_strings, keywords, USE.NAMES=F)
stopCluster(mcluster)
В соответствии с инструкциями, код в настоящее время подсчитывает частоту появления ключевых слов в каждом документе, которая составляет 4,4.
Но я хотел бы настроить свою функцию так, чтобы программа считала количество ключевых слов, которые появляются в каждом документе. Правильный ответ должен быть 2, 3.
^ также fixed = TRUE
@MichaelChirico, это действительно лучше (хотя в этом случае работает и то, и другое); добавил это
@Jaap У вас отсутствуют границы слов вокруг ключевых слов.





Вот базовая опция R с использованием apply и grepl:
keywords <- c("Toyota", "Prius", "BMW", "M3")
documents <- c("New Toyota Prius for sale, the Toyota Prius is in good condition","BMW M3 that drives like a Toyota but is a BMW")
keywords <- paste0("\\b", keywords, "\\b")
res <- sapply(keywords, function(x) grepl(x, documents))
rowSums(res)
[1] 2 3
Обратите внимание, что есть важный шаг выше, на котором мы оборачиваем каждый термин ключевого слова в границы слова. Это предотвратит совпадение с ложным флагом из-за того, что ключевое слово окажется подстрокой большего слова.
rowSums(sapply(keywords, grepl, x = documents, fixed = TRUE))