Разделенная выборка объектов корпуса RTM

Я использую пакет R tm, пытаясь разделить свой корпус на набор для обучения и набор для тестирования и закодировать их в метаданные для выбора. Как проще всего это сделать (предположим, я пытаюсь разделить образец пополам)?

Вот некоторые вещи, которые я пробовал:

  1. Я знаю, что когда я печатаю...
> meta(d)
    MetaID Y
1        0 1
2        0 1

Я вижу идентификаторы, но не могу получить к ним доступ (чтобы сказать, что первая половина принадлежит одному набору, а вторая - другому набору). 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 работает, но является избыточным. Я ищу полновекторный способ доступа к мета-идентификатору или, как правило, более разумный способ подмножества и назначения метапеременной «разделить».


r tm
person Mittenchops    schedule 11.02.2013    source источник


Ответы (2)


Корпус — это просто список. Так что вы можете разделить его как обычный список. Вот пример:

Я создаю некоторые данные. Я использую данные в пакете 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
person agstudy    schedule 12.02.2013
comment
@TylerRinker Спасибо. Я редактирую свой ответ, чтобы отразить ваш комментарий. - person agstudy; 11.03.2014

## 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"))

Кажется, это работает.

person MrOoijer    schedule 12.02.2013