web-dev-qa-db-fra.com

R tm removeWords fonction ne supprimant pas les mots

J'essaie de supprimer quelques mots d'un corpus que j'ai construit mais cela ne semble pas fonctionner. Je passe d'abord par tout en revue et crée une trame de données qui répertorie mes mots par ordre de fréquence. J'utilise cette liste pour identifier les mots qui ne m'intéressent pas, puis j'essaie de créer une nouvelle liste avec les mots supprimés. Cependant, les mots restent dans mon jeu de données. Je me demande ce que je fais mal et pourquoi les mots ne sont pas supprimés? J'ai inclus le code complet ci-dessous:

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)

Si vous regardez dans tf1, Vous remarquerez que beaucoup de mots qui ont été spécifiés pour être supprimés n'ont pas été réellement supprimés.

Je me demandais simplement ce que je fais mal et comment je pourrais supprimer ces mots de mes données?

REMARQUE: removeWords fait quelque chose car les sorties de head(tm, 100) et head(tm1, 100) ne sont pas exactement les mêmes. Ainsi, removeWords semble supprimer certaines instances des mots dont j'essaie de me débarrasser, mais pas toutes les instances.

9
Adam

J'ai changé de code et ajouté tolower. Les mots vides sont tous en minuscules, vous devez donc le faire avant de supprimer les mots vides.

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)

Les mots en majuscules ne sont plus nécessaires, car nous mettons tout en minuscules. Vous pouvez les supprimer.

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

Et comme vous pouvez le voir, le résultat est que l'étude n'est plus dans le corpus. Le reste des mots a également disparu

15
phiver

Si quelqu'un obtient une erreur comme moi et que la solution ci-dessus ne fonctionne toujours pas, essayez d'utiliser: paperCorp <- tm_map(paperCorp, content_transformer(tolower)) au lieu de paperCorp <- tm_map(paperCorp, tolower) car tolower() est une fonction du package de base et retourne structure différente (je veux dire change quelque chose dans le type de résultat) donc vous ne pouvez pas utiliser par exemple paperCorp[[j]]$content mais, seulement paperCorp[[j]]. C'est juste une digression, peut-être halepful pour quelqu'un.

5
Peter.k