2015-08-26 8 views
8

Ich versuche einige Wörter aus einem Korpus zu entfernen, das ich gebaut habe, aber es scheint nicht zu funktionieren. Ich durchlaufe zuerst alles und erstelle einen Datenrahmen, der meine Wörter in der Reihenfolge ihrer Häufigkeit auflistet. Ich verwende diese Liste, um Wörter zu identifizieren, an denen ich nicht interessiert bin, und versuche dann, eine neue Liste mit den entfernten Wörtern zu erstellen. Die Wörter bleiben jedoch in meinem Datensatz. Ich frage mich, was ich falsch mache und warum die Wörter nicht entfernt werden? Ich habe den vollständigen Code unten enthalten:R tm removeWords Funktion entfernt keine Wörter

install.packages("rvest") 
install.packages("tm") 
install.packages("SnowballC") 
install.packages("stringr") 
library(stringr) 
library(tm) 
library(SnowballC) 
library(rvest) 

# Pull in the data I have been using. 
paperList <- html("http://journals.plos.org/plosone/search?q=nutrigenomics&sortOrder=RELEVANCE&filterJournals=PLoSONE&resultsPerPage=192") 
paperURLs <- paperList %>% 
    html_nodes(xpath="//*[@class='search-results-title']/a") %>% 
    html_attr("href") 
paperURLs <- paste("http://journals.plos.org", paperURLs, sep = "") 
paper_html <- sapply(1:length(paperURLs), function(x) html(paperURLs[x])) 

paperText <- sapply(1:length(paper_html), function(x) paper_html[[1]] %>% 
         html_nodes(xpath="//*[@class='article-content']") %>% 
         html_text() %>% 
         str_trim(.)) 
# Create corpus 
paperCorp <- Corpus(VectorSource(paperText)) 
for(j in seq(paperCorp)) 
{ 
    paperCorp[[j]] <- gsub(":", " ", paperCorp[[j]]) 
    paperCorp[[j]] <- gsub("\n", " ", paperCorp[[j]]) 
    paperCorp[[j]] <- gsub("-", " ", paperCorp[[j]]) 
} 

paperCorp <- tm_map(paperCorp, removePunctuation) 
paperCorp <- tm_map(paperCorp, removeNumbers) 

paperCorp <- tm_map(paperCorp, removeWords, stopwords("english")) 

paperCorp <- tm_map(paperCorp, stemDocument) 

paperCorp <- tm_map(paperCorp, stripWhitespace) 
paperCorpPTD <- tm_map(paperCorp, PlainTextDocument) 

dtm <- DocumentTermMatrix(paperCorpPTD) 

termFreq <- colSums(as.matrix(dtm)) 
head(termFreq) 

tf <- data.frame(term = names(termFreq), freq = termFreq) 
tf <- tf[order(-tf[,2]),] 
head(tf) 

# After having identified words I am not interested in 
# create new corpus with these words removed. 
paperCorp1 <- tm_map(paperCorp, removeWords, c("also", "article", "Article", 
               "download", "google", "figure", 
               "fig", "groups","Google", "however", 
               "high", "human", "levels", 
               "larger", "may", "number", 
               "shown", "study", "studies", "this", 
               "using", "two", "the", "Scholar", 
               "pubmedncbi", "PubMedNCBI", 
               "view", "View", "the", "biol", 
               "via", "image", "doi", "one", 
               "analysis")) 

paperCorp1 <- tm_map(paperCorp1, stripWhitespace) 
paperCorpPTD1 <- tm_map(paperCorp1, PlainTextDocument) 
dtm1 <- DocumentTermMatrix(paperCorpPTD1) 
termFreq1 <- colSums(as.matrix(dtm1)) 
tf1 <- data.frame(term = names(termFreq1), freq = termFreq1) 
tf1 <- tf1[order(-tf1[,2]),] 
head(tf1, 100) 

Wenn Sie tf1 schauen durch Sie, dass viele der Wörter werden feststellen, dass nicht tatsächlich entfernt wurden entfernt werden angegeben wurden.

Ich frage mich nur, was ich falsch mache, und wie ich diese Wörter aus meinen Daten entfernen könnte?

HINWEIS: removeWords macht etwas, weil die Ausgabe von head(tm, 100) und head(tm1, 100) nicht genau die gleichen sind. So scheint removeWords einige Instanzen der Wörter zu entfernen, die ich versuche loszuwerden, aber nicht alle Instanzen.

+2

In Ihrem Code ist ein Tippfehler enthalten. 'paperCorp1 <- tm_map (paperCorp, removeWords, c (" die "))' sollte 'paperCorp1 <- tm_map sein (paperCorp1, removeWords, c (" the "))' – phiver

+0

Hallo @phiver, danke für das Abholen. Ich habe das versehentlich vergessen, als ich versuchte, das Problem herauszufinden. Nach dem Entfernen dieser Codezeile habe ich immer noch das gleiche Problem. Viele der Wörter, die ich entfernen möchte, einschließlich "der", sind immer noch in "tf1". – Adam

+0

Es könnte wegen der Großbuchstaben Wörter. Versuchen Sie: 'paperCorp <- tm_map (paperCorp, tolower)' – scoa

Antwort

13

Ich habe einen Code um und fügte hinzu Tolower. Die Stoppwörter sind alle in Kleinbuchstaben, Sie müssen dies also zuerst tun, bevor Sie Stoppwörter entfernen.

paperCorp <- tm_map(paperCorp, removePunctuation) 
paperCorp <- tm_map(paperCorp, removeNumbers) 
# added tolower 
paperCorp <- tm_map(paperCorp, tolower) 
paperCorp <- tm_map(paperCorp, removeWords, stopwords("english")) 
# moved stripWhitespace 
paperCorp <- tm_map(paperCorp, stripWhitespace) 

paperCorp <- tm_map(paperCorp, stemDocument) 

Großbuchstaben werden nicht mehr benötigt, da wir alles auf Kleinbuchstaben setzen. Sie können diese entfernen.

paperCorp <- tm_map(paperCorp, removeWords, c("also", "article", "Article", 
               "download", "google", "figure", 
               "fig", "groups","Google", "however", 
               "high", "human", "levels", 
               "larger", "may", "number", 
               "shown", "study", "studies", "this", 
               "using", "two", "the", "Scholar", 
               "pubmedncbi", "PubMedNCBI", 
               "view", "View", "the", "biol", 
               "via", "image", "doi", "one", 
               "analysis")) 

paperCorpPTD <- tm_map(paperCorp, PlainTextDocument) 

dtm <- DocumentTermMatrix(paperCorpPTD) 

termFreq <- colSums(as.matrix(dtm)) 
head(termFreq) 

tf <- data.frame(term = names(termFreq), freq = termFreq) 
tf <- tf[order(-tf[,2]),] 
head(tf) 

      term freq 
fatty  fatty 29568 
pparα  ppara 23232 
acids  acids 22848 
gene  gene 15360 
dietary dietary 12864 
scholar scholar 11904 

tf[tf$term == "study"] 


data frame with 0 columns and 1659 rows 

Und wie Sie sehen können, ist das Ergebnis, dass Studie nicht mehr im Korpus ist. Der Rest der Worte sind auch

gegangen
5

Wenn jemand Fehler wie ich bekommt und über Lösung noch nicht funktioniert, versuchen Verwendung: paperCorp <- tm_map(paperCorp, content_transformer(tolower)) statt paperCorp <- tm_map(paperCorp, tolower) weil tolower() ist eine Funktion von Basispaket und gibt unterschiedliche Struktur (ich meine ändert sich etwas im Ergebnistyp), so dass Sie zB paperCorp[[j]]$content aber nur paperCorp[[j]] nicht verwenden können. Es ist nur eine Abschweifung, vielleicht für jemanden halthaltig.

Verwandte Themen