web-dev-qa-db-fra.com

liste des fréquences Word utilisant R

J'utilise le paquet tm pour exécuter une analyse de texte. Mon problème est de créer une liste avec des mots et leurs fréquences associées à ceux-ci

library(tm)
library(RWeka)

txt <- read.csv("HW.csv",header=T) 
df <- do.call("rbind", lapply(txt, as.data.frame))
names(df) <- "text"

myCorpus <- Corpus(VectorSource(df$text))
myStopwords <- c(stopwords('english'),"originally", "posted")
myCorpus <- tm_map(myCorpus, removeWords, myStopwords)

#building the TDM

btm <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3))
myTdm <- TermDocumentMatrix(myCorpus, control = list(tokenize = btm))

J'utilise généralement le code suivant pour générer une liste de mots dans une plage de fréquences

frq1 <- findFreqTerms(myTdm, lowfreq=50)

Existe-t-il un moyen d'automatiser cela afin que nous obtenions une trame de données avec tous les mots et leur fréquence?

L'autre problème auquel je suis confronté est la conversion du terme matrice de documents en un bloc de données. Comme je travaille sur de grands échantillons de données, je rencontre des erreurs de mémoire. Existe-t-il une solution simple à cela?

18
ProcRJ

Essaye ça

data("crude")
myTdm <- as.matrix(TermDocumentMatrix(crude))
FreqMat <- data.frame(ST = rownames(myTdm), 
                      Freq = rowSums(myTdm), 
                      row.names = NULL)
head(FreqMat, 10)
#            ST Freq
# 1       "(it)    1
# 2     "demand    1
# 3  "expansion    1
# 4        "for    1
# 5     "growth    1
# 6         "if    1
# 7         "is    2
# 8        "may    1
# 9       "none    2
# 10      "opec    2
19
David Arenburg

En regardant le source de findFreqTerms, il semble que la fonction slam::row_sums fait l'affaire lorsqu'il est appelé sur une matrice de document de terme. Essayez par exemple:

data(crude)
slam::row_sums(TermDocumentMatrix(crude))
9
Daniel Janus

J'ai les lignes suivantes en R qui peuvent aider à créer des fréquences Word et à les mettre dans un tableau, il lit le fichier de texte au format .txt et crée les fréquences de mots, j'espère que cela peut aider toute personne intéressée.

avisos<- scan("anuncio.txt", what="character", sep="\n")
avisos1 <- tolower(avisos)
avisos2 <- strsplit(avisos1, "\\W")
avisos3 <- unlist(avisos2)
freq<-table(avisos3)
freq1<-sort(freq, decreasing=TRUE)
temple.sorted.table<-paste(names(freq1), freq1, sep="\\t")
cat("Word\tFREQ", temple.sorted.table, file="anuncio.txt", sep="\n")
8
alejandro

En fonction de vos besoins, l'utilisation de certaines fonctions tidyverse peut être une solution approximative qui offre une certaine flexibilité en termes de gestion de la capitalisation, de la ponctuation et des mots vides:

text_string <- 'I have been using the tm package to run some text analysis. My problem is with creating a list with words and their frequencies associated with the same. I typically use the following code for generating list of words in a frequency range. Is there any way to automate this such that we get a dataframe with all words and their frequency?
The other problem that i face is with converting the term document matrix into a data frame. As i am working on large samples of data, I run into memory errors. Is there a simple solution for this?'

stop_words <- c('a', 'and', 'for', 'the') # just a sample list of words I don't care about

library(tidyverse)
data_frame(text = text_string) %>% 
  mutate(text = tolower(text)) %>% 
  mutate(text = str_remove_all(text, '[[:punct:]]')) %>% 
  mutate(tokens = str_split(text, "\\s+")) %>%
  unnest() %>% 
  count(tokens) %>% 
  filter(!tokens %in% stop_words) %>% 
  mutate(freq = n / sum(n)) %>% 
  arrange(desc(n))


# A tibble: 64 x 3
  tokens      n   freq
  <chr>   <int>  <dbl>
1 i           5 0.0581
2 with        5 0.0581
3 is          4 0.0465
4 words       3 0.0349
5 into        2 0.0233
6 list        2 0.0233
7 of          2 0.0233
8 problem     2 0.0233
9 run         2 0.0233
10 that       2 0.0233
# ... with 54 more rows
3
sbha

apply(myTdm, 1, sum) ou rowSums(as.matrix(myTdm)) donne-t-il le nombre de ngrammes que vous recherchez?

2
Ben
a = scan(file='~/Desktop//test.txt',what="list")
a1 = data.frame(lst=a)
count(a1,vars="lst")

semble fonctionner pour obtenir des fréquences simples. J'ai utilisé l'analyse parce que j'avais un fichier txt, mais cela devrait aussi fonctionner avec read.csv.

2
Tahnoon Pasha