R:使用grep和tm包

时间:2016-05-06 15:18:21

标签: r dictionary text-mining tm

嗨:我有一本由其他人准备的否定词条词典。我不确定他们是如何进行干预的,但看起来他们使用的不仅仅是Porter Stemer。字典有一个通配符(*),我认为它应该能够阻止发生。但是我不知道如何在R上下文中使用grep()或tm包来使用它,所以我把它剥离出来希望找到一种方法来grep部分匹配。 所以原始字典看起来像这样

#load libraries
library(tm)
#sample dictionary terms for polarize and outlaw
negative<-c('polariz*', 'outlaw*')
#strip out wildcard
negative<-gsub('*', '', negative)
#test corpus
test<-c('polarize', 'polarizing', 'polarized', 'polarizes', 'outlaw', 'outlawed', 'outlaws')
#Here is how R's porter stemmer stems the text
stemDocument(test)

所以,如果我用R&#39;阻止我的语料库,那么就像“歹徒”这样的术语。可以在字典中找到,但它不会匹配像“极化”这样的术语。因为它们的词干与词典中的词汇不同。

所以,我希望有一些方法让tm包只匹配每个单词的确切部分。所以,在没有阻止我的文件的情况下,我希望它能够挑选出来的“歹徒”。在术语“禁止”中和&#39;不法分子&#39;并挑选极化&#39;在极化&#39;,&#39;极化和&#39;极化&#39;。这可能吗?

#Define corpus
test.corp<-Corpus(VectorSource(test))  
#make Document Term Matrix
dtm<-documentTermMatrix(test.corp, control=list(dictionary=negative))
#inspect
inspect(dtm)

1 个答案:

答案 0 :(得分:1)

我没有看到任何 tm 的答案,所以这里有一个使用 quanteda 包作为替代方案。它允许您在字典条目中使用“glob”通配符值,这是 quanteda的字典函数的默认valuetype。 (参见?dictionary。)使用这种方法,您无需中止文本。

library(quanteda)
packageVersion("quanteda")
## [1] ‘0.9.6.2’

# create a quanteda dictionary, essentially a named list
negative <- dictionary(list(polariz = 'polariz*', outlaw = 'outlaw*'))
negative
## Dictionary object with 2 key entries.
##  - polariz: polariz*
##  - outlaw: outlaw*

test <- c('polarize', 'polarizing', 'polarized', 'polarizes', 'outlaw', 'outlawed', 'outlaws')

dfm(test, dictionary = negative, valuetype = "glob", verbose = FALSE)
## Document-feature matrix of: 7 documents, 2 features.
## 7 x 2 sparse Matrix of class "dfmSparse"
##        features
## docs    polariz outlaw
##   text1       1      0
##   text3       1      0
##   text2       1      0
##   text4       1      0
##   text5       0      1
##   text6       0      1
##   text7       0      1