我有一个文档,其中包含特殊字符以及!
,#
,@
,$
,%
等文字。以下代码用于获取最常用的术语列表。但是当它执行时,常用术语列表中缺少特殊字符,即如果"#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)
我到底哪里错了?
答案 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