使用带有tm包的R时如何准确删除标点符号

Lis*_*sen 6 customization r text-mining punctuation tm

更新:

我想我可能有一个解决方法来解决这个问题,只需添加一个代码:dtms = removeSparseTerms(dtm,0.1)它将删除语料库中的稀疏字符.但我认为这只是一种解决方法,还在等待专家的回答!


最近我正在使用tm包学习R中的文本挖掘.我有一个想法,就最大频率的ABAP程序中的单词绘制一个词云.所以我写了一个R程序来实现这一点.

library(tm)
library(SnowballC)
library(wordcloud)

# set path
path = system.file("texts","abapcode",package = "tm")

# make corpus
code = Corpus(DirSource(path),readerControl = list(language = "en"))

# cleanse text
code = tm_map(code,stripWhitespace)
code = tm_map(code,removeWords,stopwords("en"))
code = tm_map(code,removePunctuation)
code = tm_map(code,removeNumbers)

# make DocumentTermMatrix
dtm = DocumentTermMatrix(code)

#freqency 
freq = sort(colSums(as.matrix(dtm)),decreasing = T)

#wordcloud(code,scale = c(5,1),max.words = 50,random.order = F,colors = brewer.pal(8, "Dark2"),rot.per = 0.35,use.r.layout = F)
wordcloud(names(freq),freq,scale = c(5,1),max.words = 50,random.order = F,colors = brewer.pal(8, "Dark2"),rot.per = 0.35,use.r.layout = F)
Run Code Online (Sandbox Code Playgroud)

但是在我的ABAP代码中,一些变体在变体名称中包含"_"和" - ",所以如果我执行了这个:

code = tm_map(code,removePunctuation)
Run Code Online (Sandbox Code Playgroud)

语料库内容不太正确,因此词云就像这样: 在此输入图像描述

如果删除"_"或" - ",有些单词会很奇怪.

然后我评论代码和单词云是这样的: 在此输入图像描述

这次单词是正确的但是出现了一些意想不到的字符,例如我的ABAP代码commet ...

那么我们是否有一些方法可以完全删除我们不想要的标点符号并保留我们想要的标点符号?

Ten*_*bai 5

发布作为答案的代码格式,但它是从文档的适配content_transformer发现从getTransformtions在发现的tm_map文档:

主要是它gsub在a中使用content_transformerremovePunctuationminus _-([:punct:]正则表达式类)相同.removePunctuation可以选择保留破折号-但不保留下划线_.

f <- content_transformer(function(x, pattern) gsub(pattern, "", x))
code <- tm_map(code, f, "[!\"#$%&'*+,./)(:;<=>?@\][\\^`{|}~]")
Run Code Online (Sandbox Code Playgroud)

在字符类中,您必须转义\,"结束括号].


Gau*_*rav 1

好的...所以以下工作...将语料库转换为数据框,删除不需要的字符,然后重新转换为语料库...

dataframe<-data.frame(text=unlist(sapply(code,[, "content")), stringsAsFactors=F) dataframe$text <- gsub("[][!#$%()*,.:;<=>@^_|~.{}]", "", dataframe$text)

code <- corpus(Vectorsource(dataframe$text))