Compter la fréquence des mots du dictionnaire dans une colonne et générer une nouvelle colonne «dictfreq»

Nov 24 2020

Cela semble être une simple commande, mais je n'arrive pas à trouver un bon moyen de générer cela dans R. Fondamentalement, je veux juste compter la fréquence de chaque mot dans un dictionnaire, dict, dans la colonne d'un autre dataframe, wordsgov:

dict = "apple", "pineapple","pear"
df$wordsgov = "i hate apple", "i hate apple", "i love pear", "i don't like pear", "pear is okay", "i eat pineapple sometimes"

sortie souhaitée: nouveau classement de fréquence, affichant tous les mots dans dict en fonction de leur fréquence dans df $ wordsgov

dict    freq_gov
"pear" : 3
"apple": 2
"pineapple: 1

J'ai essayé le code suivant, mais il m'a donné le nombre de fois où les mots dict apparaissent dans chaque ligne de df $ wordgov, ce qui n'est pas ce que je veux:

dictongov <- within(
  df,
  counts <- sapply(
    gregexpr(paste0(dict, collapse = "|"), wordsgov),
    function(x) sum(x > 0)
  )
)

Je n'arrive pas à comprendre comment changer la fonction pour qu'elle me donne la fréquence de chaque mot du dict sur dict $ wordsgov à la place. J'ai essayé str_detect mais cela ne fonctionne pas non plus. toute aide serait vraiment appréciée !!!

- modifier: j'ai utilisé ce qui suit, qui a bien fonctionné.

dictfreq <- df %>% mutate(dict = str_c(str_extract(wordsgov, str_c(dict, collapse = '|')), ':')) %>% 
                   count(dict, name = 'freq_gov') %>% arrange(desc(freq_gov))

cependant, il a supprimé tous les mots qui avaient une fréquence de 0. y a-t-il un moyen de conserver les mots avec une fréquence de 0? J'ai essayé ".drop = FALSE", mais cela ne semble pas fonctionner dans ce code. Toute aide sera grandement appréciée. Merci!

Réponses

akrun Nov 24 2020 at 21:50

Nous pouvons également le faire avec str_count

library(stringr)
library(purrr)
out <- map_int(str_c("\\b", v2, "\\b"), ~  sum(str_count(v1, .x)))
out
#[1] 2 1 3

rank(out)

Les données

v1 <- c("i hate apple", "i hate apple", "i love pear", "i don't like pear", 
       "pear is okay", "i eat pineapple sometimes")

v2 <- c("apple", "pineapple", "pear")