我正在使用R tm包,尝试将我的语料库拆分为训练集和测试集,并将其编码为元数据以供选择。最简单的方法是什么(假设我试图将我的样本分成两半)?
以下是我尝试过的一些事情:
> meta(d) MetaID Y 1 0 1 2 0 1
我看到ID,但似乎无法访问它们(为了说前半部分属于一组,第二部分属于另一组)。 rownames(attributes(d)$DMetaData)
给了我索引,但这看起来很难看,而且它们是因素。
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的完整向量方式,或者通常更聪明的方式来分组和分配给“分裂”元变量。
答案 0 :(得分:4)
语料库只是一个列表。所以你可以像普通列表一样拆分它。这是一个例子:
我创建了一些数据。我使用tm
包
txt <- system.file("texts", "txt", package = "tm")
(ovid <- Corpus(DirSource(txt)))
A corpus with 5 text documents
现在我将数据拆分为Train并进行测试
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
答案 1 :(得分: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"))
这似乎有效。