2014-11-09 26 views
6

W ciągu ostatnich kilku dni łamałem sobie głowę nad tym. Przeszukałem wszystkie archiwa SO i próbowałem sugerowanych rozwiązań, ale po prostu nie wydaje się, aby to działało. Mam zestawy dokumentów tekstowych w folderach takich jak 2000 06, 1995 -99 itd., I chcę uruchomić podstawowe operacje wyszukiwania tekstu, takie jak tworzenie macierzy terminów dokumentów i terminów macierzy dokumentów i wykonywanie operacji na niektórych współrzędnych słów. Mój skrypt działa na mniejszym korpusie, ale kiedy próbuję go z większym korpusem, zawodzi mnie. Wkleiłem kod dla jednej takiej operacji folderu.Big Text Corpus Breaks tm_map

library(tm) # Framework for text mining. 
library(SnowballC) # Provides wordStem() for stemming. 
library(RColorBrewer) # Generate palette of colours for plots. 
library(ggplot2) # Plot word frequencies. 
library(magrittr) 
library(Rgraphviz) 
library(directlabels) 

setwd("/ConvertedText") 
txt <- file.path("2000 -06") 

docs<-VCorpus(DirSource(txt, encoding = "UTF-8"),readerControl = list(language = "UTF-8")) 
docs <- tm_map(docs, content_transformer(tolower), mc.cores=1) 
docs <- tm_map(docs, removeNumbers, mc.cores=1) 
docs <- tm_map(docs, removePunctuation, mc.cores=1) 
docs <- tm_map(docs, stripWhitespace, mc.cores=1) 
docs <- tm_map(docs, removeWords, stopwords("SMART"), mc.cores=1) 
docs <- tm_map(docs, removeWords, stopwords("en"), mc.cores=1) 
#corpus creation complete 

setwd("/ConvertedText/output") 
dtm<-DocumentTermMatrix(docs) 
tdm<-TermDocumentMatrix(docs) 
m<-as.matrix(dtm) 
write.csv(m, file="dtm.csv") 
dtms<-removeSparseTerms(dtm, 0.2) 
m1<-as.matrix(dtms) 
write.csv(m1, file="dtms.csv") 
# matrix creation/storage complete 

freq <- sort(colSums(as.matrix(dtm)), decreasing=TRUE) 
wf <- data.frame(word=names(freq), freq=freq) 
freq[1:50] 
#adjust freq score in next line 
p <- ggplot(subset(wf, freq>100), aes(word, freq))+ geom_bar(stat="identity")+ theme(axis.text.x=element_text(angle=45, hjust=1)) 
ggsave("frequency2000-06.png", height=12,width=17, dpi=72) 
# frequency graph generated 


x<-as.matrix(findFreqTerms(dtm, lowfreq=1000)) 
write.csv(x, file="freqterms00-06.csv") 
png("correlation2000-06.png", width=12, height=12, units="in", res=900) 
graph.par(list(edges=list(col="lightblue", lty="solid", lwd=0.3))) 
graph.par(list(nodes=list(col="darkgreen", lty="dotted", lwd=2, fontsize=50))) 
plot(dtm, terms=findFreqTerms(dtm, lowfreq=1000)[1:50],corThreshold=0.7) 
dev.off() 

Kiedy używam argumentu mc.cores = 1 w tm_map, operacja jest kontynuowana przez czas nieokreślony. Jednak jeśli użyję Lazy = TRUE argument w tm_map, pozornie idzie dobrze, ale kolejne operacje dają ten błąd.

Error in UseMethod("meta", x) : 
    no applicable method for 'meta' applied to an object of class "try-error" 
In addition: Warning messages: 
1: In mclapply(x$content[i], function(d) tm_reduce(d, x$lazy$maps)) : 
    all scheduled cores encountered errors in user code 
2: In mclapply(unname(content(x)), termFreq, control) : 
    all scheduled cores encountered errors in user code 

czekałem całego rozwiązania, ale nie udało konsekwentnie. Każda pomoc będzie bardzo ceniona!

Najlepsza! k

Odpowiedz

13

Znalazłem rozwiązanie, które działa.

Tło/Debugging Kroki

Próbowałem kilka rzeczy, które nie działa:

  • dodając: "content_transformer" do pewnego tm_map, aby wszystko do jednego (totower)
  • Dodanie " lazy = T "do tm_map
  • Wypróbowałem kilka równoległych pakietów komputerowych

Chociaż nie działa dla 2 moich skryptów, działa za każdym razem dla trzeciego skryptu. Ale kod wszystkich trzech skryptów jest taki sam, tylko rozmiar pliku .rda, który ładuję, jest inny. Struktura danych jest również identyczna dla wszystkich trzech.

  • Zestaw danych 1: Rozmiar - 493.3KB = błąd
  • Dataset 2: Rozmiar - 630.6KB = błąd
  • Dataset 3: Rozmiar - 300.2KB = dzieła!

Po prostu dziwne.

Moja sessionInfo() wyjściowa:

R version 3.1.2 (2014-10-31) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 

locale: 
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] snowfall_1.84-6 snow_0.3-13  Snowball_0.0-11 RWekajars_3.7.11-1 rJava_0.9-6    RWeka_0.4-23  
[7] slam_0.1-32  SnowballC_0.5.1 tm_0.6    NLP_0.1-5   twitteR_1.1.8  devtools_1.6  

loaded via a namespace (and not attached): 
[1] bit_1.1-12  bit64_0.9-4 grid_3.1.2  httr_0.5  parallel_3.1.2 RCurl_1.95-4.3 rjson_0.2.14 stringr_0.6.2 
[9] tools_3.1.2 

Rozwiązanie

po prostu dodaje ten wiersz po załadowaniu danych i wszystko działa teraz:

MyCorpus <- tm_map(MyCorpus, 
        content_transformer(function(x) iconv(x, to='UTF-8-MAC', sub='byte')), 
        mc.cores=1) 

Znaleziony wskazówkę tutaj: http://davetang.org/muse/2013/04/06/using-the-r_twitter-package/ (Autor zaktualizował swój kod z powodu błędu w dniu 26 listopada 2014 r.)

+1

Dzięki, bardzo pomogłem! – xbsd

+0

Wielkie dzięki! Zgubiłem hasło do mojego konta SO, więc po prostu zobaczyłem to teraz :) – Kartik