2013-02-13 3 views
2

Я создаю Copus из dataframe. Я передаю его как VectorSource, так как есть только один столбец, который я хочу использовать в качестве источника текста. Однако это работает, но мне нужны идентификаторы документов в корпусе для соответствия идентификаторам документа из фреймворка данных. Идентификаторы документов хранятся в отдельном столбце исходного фрейма.Как я могу вручную установить идентификатор документа в корпусе?

df <- as.data.frame(t(rbind(c(1,3,5,7,8,10), 
         c("text", "lots of text", "too much text", "where will it end",   "give peas a chance","help")))) 
colnames(df) <- c("ids","textColumn") 
library("tm") 
library("lsa") 
corpus <- Corpus(VectorSource(df[["textColumn"]])) 

Выполнение этого кода создает корпус, однако идентификаторы документов работают от 1 до 6. Есть ли способ создания корпуса с идентификаторами документов 1,3,5,7,8,10?

ответ

2

Ну, один простой, но не очень элегантный способ назначить идентификаторы для документов позже может быть следующим:

for (i in 1:length(corpus)) { 
    attr(corpus[[i]], "ID") <- df$ids[i] 
} 
+0

Это работает! Я подожду немного, чтобы увидеть, может ли кто-нибудь придумать что-то более элегантное, возможно, назначая их во время создания реального корпуса. Но если они не могут, я с радостью соглашусь с этим, если бы не за вашу скорость ответа;) – user1098798

+0

@ user1098798 Спасибо! Я слегка изменил свой ответ, потому что, очевидно, вы можете напрямую повторно использовать идентификаторы из ваших исходных данных ... – juba

0

Вот qdap подхода к этой проблеме, которая может справиться с этим без петли :

Используйте qdap version >= 1.1.0 с самого начала, чтобы преобразовать dataframe в Corpus, и теги идентификаторов будут автоматически добавлены.

with(df, as.Corpus(textColumn, ids)) 

## <<VCorpus>> 
## Metadata: corpus specific: 0, document level (indexed): 3 
## Content: documents: 6 


## Look around a bit 
meta(with(df, as.Corpus(textColumn, ids)), tag="id") 
inspect(with(df, as.Corpus(textColumn, ids))) 
+0

'df2tm_corpus' устарел; вы можете отредактировать свой ответ и вместо этого заменить его «as.Corpus»? – coip

+0

это не работает!, У меня всегда есть значения null int it results – bicepjai

2

Я знаю, что это, вероятно, поздно @ user1098798, но есть способ, как вы можете указать идентификаторы непосредственно при создании корпуса. Вам необходимо загрузить данные как DataframeSource() и добавить отображение в столбцы:

corpus = VCorpus(DataframeSource(df), readerControl = list(reader = readTabular(mapping = list(content = "textColumn", id = "ids")))) 
Смежные вопросы