Подсчет, сколько раз пара слов появляется вместе в текстовом файле, используя 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)])
Другие вопросы по тегам