2013-08-07 24 views
13

Używam pakietu tm do uruchomienia analizy tekstu. Mój problem jest z tworzenia listy ze słowami i ich częstotliwości związane z tym samymlista częstotliwości słów przy użyciu R

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

I zazwyczaj użyć następującego kodu do generowania listy słów w zakresie częstotliwości

frq1 <- findFreqTerms(myTdm, lowfreq=50) 

Czy istnieje jakiś sposób, zautomatyzować to tak, że otrzymujemy ramkę danych ze wszystkimi słowami i ich częstotliwością?

Innym problemem, z którym borykam się, jest konwersja terminu macierz dokumentu na ramkę danych. Ponieważ pracuję nad dużymi próbkami danych, uruchamiam błędy pamięci. Czy jest to proste rozwiązanie?

Odpowiedz

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

wydaje się działać, aby uzyskać proste częstotliwości. Użyłem skanowania, ponieważ miałem plik txt, ale powinien również działać z read.csv.

+0

Powyższe nie pomoże mi wymyślić n gramów i skojarzeń słów. Interesuje mnie ocena częstotliwości n gramów, które zostały wygenerowane. – ProcRJ

2

Czy apply(myTdm, 1, sum) lub rowSums(as.matrix(myTdm)) podać liczby ngram, które chcesz?

17

Spróbuj

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 
+0

Wspaniałe dzięki! Jedna uwaga dla początkujących: myTdm <- TermDocumentMatrix (surowy) [1:10, 1:10] daje 10 na 10 tdm, więc jeśli korpus jest większy, nie powinno się używać [1:10, 1:10] – Simone

+0

Tak myślałem. Na początku R może być dość mylące, więc dodałem go dla początkujących R. – Simone

+0

wystarczy, jeśli wykonasz: 'FreqMat <- as.data.frame (as.table (myTdm))' – jibiel

7

mam następujące linie w R, które mogą przyczynić się do stworzenia częstotliwości słowo i umieścić je w tabeli, odczytuje plik z tekstem w formacie txt i stworzyć częstotliwości słów , Mam nadzieję, że może to pomóc każdemu zainteresowanemu.

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

to było bardzo pomocne dla jednego z moich malutkich projektów domowych w eksploracji tekstu .. wielkie dzięki :)) – LearneR

+0

również, jedno pytanie .. jeśli chcę policzyć częstotliwość określonej frazy lub zdania w zrzutach tekstu czy jest jakiś sposób na zrobienie tego? na przykład: załóżmy, że chcę znaleźć częstotliwość zestawu słów "cóż za dziwny incydent" w całej książce ... jakie zmiany należy wprowadzić w powyższym kodzie? – LearneR

+0

Bardzo fajnie - dziękuję za wiadomość! – jmb277

6

Patrząc na source z findFreqTerms, wydaje się, że funkcja slam::row_sums załatwia sprawę kiedy wezwał matrycy określenie dokumentu. Spróbuj na przykład:

data(crude) 
slam::row_sums(TermDocumentMatrix(crude)) 
Powiązane problemy