Подсчет, сколько раз пара слов появляется вместе в текстовом файле, используя R
У меня есть функция, которая берет документ текста и два слова, которые я хочу найти в этом тексте, и я пытаюсь выяснить вероятность того, что эти два слова появятся рядом друг с другом в тексте. Итак, первое, что я сделал, это собрал их в пары. Мой документ называется "слова", и функция принимает 3 аргумента: документ, word1 и word2. Я хочу выяснить, сколько раз они появляются рядом друг с другом в тексте.
pairs <- c()
# Iterates through and creates every possible pair of adjacent words
for (i in 1:(length(words)-1)) {
temp <- paste(words[i],words[i+1], sep = ":") # Temporarily group adjacent words together with a : in between
temp <- sort(strsplit(temp, ":")[[1]]) # Sort to get them lexically organized
pairs[i] <- paste(temp[1], temp[2], sep=":") # Store this pair in the list
}
Теперь я пытаюсь сделать счетчик, чтобы выяснить, сколько раз мои два указанных слова появляются вместе. Пока я пробовал это
pairs2<-0
for(i in pairs){
if(i==word1:word2|i==word2:word1){
pairs2<-pairs2+1
}
Но я получаю ошибку
Error in word1:word2 : NA/NaN argument
Как заставить R понять, что я хочу, чтобы каждая из этих пар word1:word2 и word2:word1 была двумя конкретными словами, и, когда у меня правильная комбинация, добавить +1 к счетчику?
2 ответа
Вот что я сделаю. Учитывая, что у вас есть вектор слов под названием words
:
library(dplyr)
# use lead from dplyr to create all pairs of adjacent words
word.pairs <- paste(words, lead(words), sep=":")
# use dplyr to sum up all pairs of words
word.pairs <- as.data.frame(word.pairs) %>%
group_by(word.pairs) %>%
summarise(Count = n())
Это дает вам счет каждой пары слов в вашем векторе. Вы можете использовать dplyr
"s filter()
а также arrange()
функции для сортировки данных или поиска интересующей пары слов. Например, если вы хотите найти количество word1
а также word2
word.pairs %>% filter(word.pairs == paste(word1, word2, sep=":"))
Вам не нужен цикл for для этого, если ваш документ разбит на список пар слов.
Например, если у вас была строка вроде:
test <- "hello my name is my name is tony"
И ваша функция разбила его на список пар слов:
pairs <- list("hello my", "my name", "name is", "is my", "my name", "name is", "is tony")
Вы можете получить количество раз, когда "мое" и имя появляются вместе просто:
appearance <- length(pairs[pairs == "my name"|pairs == "name my"]) # 2
Или в вашем случае:
pairs2 <- length(pairs[pairs == paste(word1, word2) | pairs == paste(word2, word1)])