Frage Liste der Worthäufigkeiten mit R


Ich habe das tm-Paket verwendet, um eine Textanalyse durchzuführen. Mein Problem besteht darin, eine Liste mit Wörtern und deren Häufigkeiten zu erstellen

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))

Normalerweise verwende ich den folgenden Code zum Generieren einer Liste von Wörtern in einem Frequenzbereich

frq1 <- findFreqTerms(myTdm, lowfreq=50)

Gibt es eine Möglichkeit, dies zu automatisieren, so dass wir einen Datenrahmen mit allen Wörtern und deren Häufigkeit erhalten?

Das andere Problem, mit dem ich konfrontiert bin, besteht darin, den Begriff Dokumentenmatrix in einen Datenrahmen umzuwandeln. Während ich an großen Datenmengen arbeite, stoße ich auf Speicherfehler. Gibt es dafür eine einfache Lösung?


18
2017-08-07 10:30


Ursprung


Antworten:


Versuche dies

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

18
2017-11-17 13:11



Mit Blick auf die Quelle von findFreqTerms, es scheint, dass die Funktion slam::row_sums macht den Trick, wenn eine Term-Dokument-Matrix aufgerufen wird. Versuchen Sie zum Beispiel:

data(crude)
slam::row_sums(TermDocumentMatrix(crude))

8
2017-07-18 16:43



Ich habe die folgenden Zeilen in R, die helfen können, Worthäufigkeiten zu erstellen und sie in eine Tabelle zu legen, es liest die Textdatei im .txt-Format und erstellt die Häufigkeiten von Wörtern, ich hoffe, dass dies jedem Interessierten helfen kann.

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")

7
2018-05-20 17:18



Tut apply(myTdm, 1, sum) oder rowSums(as.matrix(myTdm)) geben Sie die Ngram-Zahlen, nach denen Sie suchen?


2
2017-08-22 16:07



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

scheint zu arbeiten, um einfache Frequenzen zu bekommen. Ich habe Scan verwendet, weil ich eine TXT-Datei hatte, aber es sollte auch mit read.csv funktionieren.


1
2017-08-07 10:39



Abhängig von Ihren Bedürfnissen, einige verwenden tidyverse Funktionen können eine grobe Lösung sein, die eine gewisse Flexibilität bietet, wenn es um Groß- und Kleinschreibung, Interpunktion und Stoppwörter geht:

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

1
2017-07-13 02:18