【问题标题】:R tm removeWords function not removing wordsR tm removeWords 函数不删除单词
【发布时间】:2015-11-20 10:37:15
【问题描述】:

我正在尝试从我建立的语料库中删除一些单词,但它似乎不起作用。我首先遍历所有内容并创建一个数据框,按频率顺序列出我的单词。我使用此列表来识别我不感兴趣的单词,然后尝试创建一个删除了单词的新列表。但是,这些词仍保留在我的数据集中。我想知道我做错了什么以及为什么这些词没有被删除?我在下面包含了完整的代码:

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)

如果您查看tf1,您会注意到很多被指定要删除的单词实际上并没有被删除。

只是想知道我做错了什么,以及如何从我的数据中删除这些词?

注意:removeWords 正在做某事,因为head(tm, 100)head(tm1, 100) 的输出并不完全相同。所以removeWords 似乎删除了我想要删除的单词的一些实例,但不是所有实例。

【问题讨论】:

  • 您的代码中有错字。 paperCorp1 &lt;- tm_map(paperCorp, removeWords, c("the")) 应该是 paperCorp1 &lt;- tm_map(paperCorp1, removeWords, c("the"))
  • 嗨@phiver,感谢您接受这个。当我试图找出问题时,我不小心把它留在了里面。删除那行代码后,我仍然遇到同样的问题。我试图删除的许多单词,包括“the”,仍在 tf1 中。
  • 这可能是因为大写单词。试试看:paperCorp &lt;- tm_map(paperCorp,tolower)

标签: r text text-mining tm corpus


【解决方案1】:

我切换了一些代码并添加了tolower。停用词都是小写的,因此您需要先执行此操作,然后再删除停用词。

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)

不再需要大写单词,因为我们将所有内容都设置为小写。您可以删除这些。

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

如您所见,结果是研究不再出现在语料库中。剩下的字也没有了

【讨论】:

    【解决方案2】:

    如果有人遇到像我这样的错误,上面的解决方案仍然不起作用,请尝试使用: paperCorp &lt;- tm_map(paperCorp, content_transformer(tolower)) 而不是 paperCorp &lt;- tm_map(paperCorp, tolower) 因为 tolower() 是来自基本包的函数并返回不同的结构(我的意思是更改结果类型中的某些内容),因此您不能使用例如 paperCorp[[j]]$content 而只能使用 paperCorp[[j]]。这只是一个题外话,可能对某些人来说是有害的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多