2014-01-10 2 views
2

Я читал разные вопросы/ответы (особенно here и here), не применяя ни к какой ситуации.Как добавить метаданные в объект tm Corpus с tm_map

У меня есть матрица 11,390 строк с атрибутами идентификатора, автора, текста, например:

library(tm) 

m <- cbind(c("01","02","03","04","05","06"), 
      c("Author1","Author2","Author2","Author3","Author3","Auhtor4"), 
      c("Text1","Text2","Text3","Text4","Text5","Text6")) 

Я хочу, чтобы создать tm корпус из него. Я могу быстро создать свой корпус с

tm_corpus <- Corpus(VectorSource(m[,3])) 

, который завершает выполнение моей матрицы 11,390 строк в

user system elapsed 
    2.383 0.175 2.557 

Но тогда, когда я пытаюсь добавить метаданные к своду с

meta(tm_corpus, type="local", tag="Author") <- m[,2] 

в время выполнения составляет 15 минут и подсчет (я прекратил выполнение).

В соответствии с обсуждением here шансы значительно уменьшить время обработки корпуса с помощью tm_map; что-то вроде

tm_corpus <- tm_map(tm_corpus, addMeta, m[,2]) 

Еще не знаю, как это сделать. Возможно, это будет что-то вроде

addMeta <- function(text, vector) { 
    meta(text, tag="Author") = vector[??] 
    text 
} 

За одну вещи, как перейти к tm_map вектору значений следует присвоить каждый текст корпуса? Должен ли я вызвать функцию из цикла? Должен ли я заключить функцию tm_map в пределах vapply?

+0

для меня работает звонок. Единственное отличие состоит в том, что я использовал «корпус» как тип: meta (tm_corpus, type = «corpus», tag = «Author») <- m [, 2] – user944351

ответ

2

Да tm_map быстрее, и это путь. Вы должны использовать его здесь с помощью глобального счетчика.

auths <- paste0('Author',seq(11390)) 
i <- 0 
tm_corpus = tm_map(tm_corpus, function(x) { 
    i <<- i +1 
    meta(x, "Author") <- m[i,2] 
    x 
}) 
6

Вы уже пробовали отличный readTabular?

## your sample data 
matrix <- cbind(c("01","02","03","04","05","06"), 
     c("Author1","Author2","Author2","Author3","Author3","Auhtor4"), 
     c("Text1","Text2","Text3","Text4","Text5","Text6")) 

## simple transformations 
matrix <- as.data.frame(matrix) 
names(matrix) <- c("id", "author", "content") 

Теперь ваш ex-matrix теперь data.frame может быть легко прочитан как корпус с помощью readTabular. ReadTabular хочет, чтобы вы определили Reader, который сам принимает отображение. В вашем сопоставлении «контент» указывает на текстовые данные и другие имена - хорошо - на мета.

## define myReader, which will be used in creation of Corpus 
myReader <- readTabular(mapping=list(id="id", author="author", content="content")) 

Теперь создание корпус такой же, как всегда, за исключением небольших изменений:

## create the corpus 
tm_corpus <- DataframeSource(matrix) 
tm_corpus <- Corpus(tm_corpus, 
    readerControl = list(reader=myReader)) 

Теперь посмотрим на содержание и мета-данные из первых пунктов:

lapply(tm_corpus, as.character) 
lapply(tm_corpus, meta) 
## output just as expected. 

Это должно быть быстро, так как это часть упаковки и чрезвычайно адаптируется. В моем собственном проекте я использую это на data.table с примерно 20 переменными - он работает как шарм.

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

+0

Для 'lapply (tm_corpus, as.character)', что это показ? Я вижу, что все находится в 'lapply (tm_corpus, meta)' now –

+0

Первая команда показывает текст (и только текст), вторая - мета-информацию, по крайней мере, в моей настройке. Вы получили разные результаты? –

+0

Да, он помещает все в метаданные –

Смежные вопросы