如何保留搜索术语频率的特殊字符?

时间:2017-05-29 10:05:12

标签: r

我有一个文档,其中包含特殊字符以及!#@$%等文字。以下代码用于获取最常用的术语列表。但是当它执行时,常用术语列表中缺少特殊字符,即如果"#StackOverFlow"是文档中出现100次的单词,我将其作为"StackOverFlow"而不是#频繁的条款清单。这是我的代码:

review_text <- paste(rome_1$text, collapse=" ")
#The special characters are present within review_text
review_source <- VectorSource(review_text)
corpus <- Corpus(review_source)
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removeWords, stopwords("english"))
dtm <- DocumentTermMatrix(corpus)
dtm2 <- as.matrix(dtm)
frequency <- colSums(dtm2)
frequency <- sort(frequency, decreasing = TRUE)
head(frequency)

我到底哪里错了?

1 个答案:

答案 0 :(得分:0)

正如您在DocumentTermMatrix文档中看到的那样:

  

这对于SimpleCorpus来说是不同的。在这种情况下,所有选项都是   一次性以固定顺序处理以提高性能。的它   总是使用Boost Tokenizer(通过Rcpp)并且不需要自定义   作为选项参数。

似乎SimpleCorpus个对象(由Corpus函数创建)使用预定义的Boost标记生成器,它自动拆分删除标点符号的单词(包括#)。

您可以改用VCorpus,并删除您想要的标点字符,例如:

library(tm)
review_text <- 
"I love #StackOverflow. #Stackoverflow is great, but Stackoverflow exceptions are not!"

review_source <- VectorSource(review_text)
corpus <- VCorpus(review_source) # N.B. use  VCorpus here !!
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removeWords, stopwords("english"))
patternRemover <- content_transformer(function(x,patternToRemove) gsub(patternToRemove,'',x))
corpus <- tm_map(corpus, patternRemover, '\\!|\\.|\\,|\\;|\\?') # remove only !.,;?

dtm <- DocumentTermMatrix(corpus,control=list(tokenize='words'))
dtm2 <- as.matrix(dtm)
frequency <- colSums(dtm2)
frequency <- sort(frequency, decreasing = TRUE)

结果:

> frequency
#stackoverflow     exceptions          great           love  stackoverflow 
             2              1              1              1              1