removeSparseTerms带有训练和测试集

时间:2013-12-22 05:26:07

标签: r tm

当我使用tm包进行文本挖掘时,我会经常遵循与此类似的工作流程:

library(tm)
data(crude)
crude = tm_map(crude, tolower)
crude = tm_map(crude, removePunctuation)
crude = tm_map(crude, removeWords, stopwords("english"))
crude = tm_map(crude, stemDocument)
dtm = DocumentTermMatrix(crude)
sparse = as.data.frame(as.matrix(removeSparseTerms(dtm, 0.8)))
spl = runif(length(crude)) < 0.7
train = subset(sparse, spl)
test = subset(sparse, !spl)

基本上,我预处理语料库,构建文档术语矩阵,删除稀疏术语,然后分成训练和测试集。

虽然使用tm包非常容易,但我不喜欢的是隐式使用训练集和测试集来确定包含哪些术语(又名removeSparseTerms在我分成训练和测试集之前调用。虽然这对于随机训练/测试集拆分可能不是太糟糕,因为我们期望训练集和测试集之间的字频率相似,但它可能会对非随机分割中的分裂产生重大影响(例如,当使用顺序观察时)

我想知道是否有人使用相对简单的方法(使用tm)提前移动训练/测试分组,仅根据训练集中的单词频率删除稀疏术语,然后从中删除术语测试集使其列与训练集的列匹配。

1 个答案:

答案 0 :(得分:3)

library(tm)
library(Rstem)
data(crude)
set.seed(1)

spl <- runif(length(crude)) < 0.7
train <- crude[spl]
test <- crude[!spl]

controls <- list(
    tolower = TRUE,
    removePunctuation = TRUE,
    stopwords = stopwords("english"),
    stemming = function(word) wordStem(word, language = "english")
    )

train_dtm <- DocumentTermMatrix(train, controls)

train_dtm <- removeSparseTerms(train_dtm, 0.8)

test_dtm <- DocumentTermMatrix(
    test,
    c(controls, dictionary = list(dimnames(train_dtm)$Terms))
    )

## train_dtm
## A document-term matrix (13 documents, 91 terms)
##
## Non-/sparse entries: 405/778
## Sparsity           : 66%
## Maximal term length: 9
## Weighting          : term frequency (tf)

## test_dtm
## A document-term matrix (7 documents, 91 terms)
##
## Non-/sparse entries: 149/488
## Sparsity           : 77%
## Maximal term length: 9
## Weighting          : term frequency (tf)

## all(dimnames(train_dtm)$Terms == dimnames(test_dtm)$Terms)
## [1] TRUE

我在使用默认词干分析器时遇到了问题。控件也有bounds选项,但在使用时我无法获得与removeSparseTerms相同的结果。我尝试使用bounds = list(local = c(0.2 * length(train), Inf))floor ceiling但没有运气。