2013-02-11 54 views
1

我正在使用R tm軟件包,試圖將我的語料庫拆分爲訓練集和測試集,並將其編碼爲用於選擇的元數據。最簡單的方法是什麼(假設我試圖將樣本分成兩半)?R tm語料庫對象的拆分示例

這裏有一些事情我已經試過:

  1. 我知道,當我鍵入...
> meta(d) 
    MetaID Y 
1  0 1 
2  0 1 

我看到ID,但似乎無法訪問他們(爲了說上半場屬於一組,而第二組屬於另一組)。 rownames(attributes(d)$DMetaData)給了我指數,但這看起來很醜,而且它們是因素。

  1. 現在,轉換成數據幀後,說d是我的數據集,我只想說:
half <- floor(dim(d)[1]/2) 
d$train <- d[1:half,] 
d$test <- d[(half+1):(half*2),] 

但我怎麼能輕易做這樣的事情......

meta(d, tag="split") = ifelse((meta(d,"ID")<=floor(length(d)/2)),"train","test") 

...得到如下結果:

> meta(d) 
    MetaID Y split 
1  0 1 train 
2  0 1 train 
...  . . ... 
100  0 1 test 

不幸的是,meta(d,"ID")不起作用,但meta(d[[1]],"ID") == 1的做法,但是多餘的。我正在尋找一種訪問元ID的全矢量方法,或者一種通常更智能的子集分配方式,並將其分配給「split」元變量。

回答

4

一個語料庫只是一個列表。所以你可以像普通列表一樣分割它。這裏舉一個例子:

我創建了一些數據。我用數據tm

txt <- system.file("texts", "txt", package = "tm") 
(ovid <- Corpus(DirSource(txt))) 
A corpus with 5 text documents 

現在我拆我的數據,以訓練和測試中

nn <- length(ovid) 
ff <- as.factor(c(rep('Train',ceiling(nn/2)), ## you create the split factor as you want 
       rep('Test',nn-ceiling(nn/2)))) ## you can add validation set for example... 
ll <- split(as.matrix(ovid),ff) 
ll 
$Test 
A corpus with 2 text documents 

$Train 
A corpus with 3 text documents 

然後我給你新的標籤

ll <- sapply(names(ll), 
       function(x) { 
       meta(ll[[x]],tag = 'split') <- ff[ff==x] 
       ll[x] 
       }) 

您可以檢查結果:

lapply(ll,meta) 
$Test.Test 
    MetaID split 
4  0 Test 
5  0 Test 

$Train.Train 
    MetaID split 
1  0 Train 
2  0 Train 
3  0 Train 
+0

+1雖然我會說這是一個列表不是矩陣。 – 2014-03-10 04:45:45

+0

@TylerRinker謝謝。我編輯我的答覆反映你的評論。 – agstudy 2014-03-10 22:51:47

2
## use test corpus crude in tm 
library(tm) 
data(crude) 

#random training sample 
half<-floor(length(crude)/2) 
train<-sample(1:length(crude), half) 

# meta doesnt handle lists or vector very well, so loop: 
for (i in 1:length(crude)) meta(crude[[i]], tag="Tset") <- "test" 
for (i in 1:half) meta(crude[[train[i]]], tag="Tset") <- "train" 

# check result 
for (i in 1:10) print(meta(crude[[i]], tag="Tset")) 

這似乎工作。