当我使用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
)提前移动训练/测试分组,仅根据训练集中的单词频率删除稀疏术语,然后从中删除术语测试集使其列与训练集的列匹配。
答案 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
但没有运气。