2013-12-22 136 views
2

當我使用tm包文本挖掘,我經常會遵循非常相似,這樣的工作流程:removeSparseTerms培訓和測試集

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)提前移動訓練/測試拆分,僅根據訓練集中的詞頻刪除疏散詞,然後刪除測試集中的詞它的列與訓練集的列匹配。

回答

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))floorceiling沒有運氣。