Разделение документа из tm Corpus на несколько документов

Немного странный вопрос: есть ли способ разделить документы корпуса, которые были импортированы с помощью функции Корпуса в tm, на несколько документов, которые затем можно будет перечитать в моем Корпусе как отдельные документы? Например, если бы я использовал inspect(documents[1]) и имел что-то вроде

`<<VCorpus (documents: 1, metadata (corpus/indexed): 0/0)>>`

`[[1]]`

`<<PlainTextDocument (metadata: 7)>>`

The quick brown fox jumped over the lazy dog

I think cats are really cool

I want to split after this line!!!

Hi mom

Purple is my favorite color

I want to split after this line!!!

Words

And stuff

и я хочу разделить документ после фразы, которую я хочу разделить после этой строки!!! появляется дважды в этом случае, возможно ли это?

Конечный результат будет выглядеть так после использования inspect(documents)

<<VCorpus (documents: 1, metadata (corpus/indexed): 0/0)>>

[[1]]

<<PlainTextDocument (metadata: 7)>>

Быстрая, коричневая лиса, перепрыгнула через ленивого пса

Я думаю, что кошки действительно крутые

Я хочу разойтись после этой строчки!!!

[[2]]

<<PlainTextDocument (metadata: 7)>>

Привет мама

Фиолетовый мой любимый цвет

Я хочу разойтись после этой строчки!!!

[[3]]

<<PlainTextDocument (metadata: 7)>>

Слова

И прочее


person src471    schedule 17.06.2015    source источник
comment
Наверное, можно манипулировать внутренностями, но зачем? Какой цели вы пытаетесь служить? Вы, например, хотите сгенерировать отдельные матрицы частот терминов или tfidf для подразделов?   -  person smci    schedule 17.06.2015
comment
У меня есть код для извлечения данных из многих одинаково отформатированных документов, но оказалось, что в реальных данных (в отличие от тестовых данных, с которыми мне разрешили работать вне офисного компьютера) PDF-файлы объединены, а не разделены. Я подумал, что будет проще справиться с этим в R, чем вручную отделять сотни документов друг от друга.   -  person src471    schedule 18.06.2015


Ответы (2)


Вы можете использовать strsplit для разделения документа, а затем снова воссоздать корпус:

Corpus(VectorSource(
          strsplit(as.character(documents[[1]]),  ## coerce to character
          "I want to split after this line!!!",   
          fixed=TRUE)[[1]]))       ## use fixed=T since you  have special
                                   ## characters in your separator  

Чтобы проверить это, мы должны сначала создать воспроизводимый пример:

documents <- Corpus(VectorSource(paste(readLines(textConnection("The quick brown fox jumped over the lazy dog
I think cats are really cool
I want to split after this line!!!
Hi mom
Purple is my favorite color
I want to split after this line!!!
Words
And stuff")),collapse='\n')))

Затем применяя предыдущее решение:

split.docs <- Corpus(VectorSource(
  strsplit(as.character(documents[[1]]),  ## coerce to character
           "I want to split after this line!!!",   
           fixed=TRUE)[[1]]))  

Теперь проверьте решение:

inspect(split.docs)
<<VCorpus (documents: 3, metadata (corpus/indexed): 0/0)>>

[[1]]
<<PlainTextDocument (metadata: 7)>>
The quick brown fox jumped over the lazy dog
I think cats are really cool


[[2]]
<<PlainTextDocument (metadata: 7)>>

Hi mom
Purple is my favorite color


[[3]]
<<PlainTextDocument (metadata: 7)>>

Words
And stuff

похоже, что strsplit убрал разделитель :)

person agstudy    schedule 17.06.2015

Вот еще более простой способ с использованием пакета quanteda:

require(quanteda)
segment(mytext, what = "other", delimiter = "I want to split after this line!!!")

Это создает список длины = 1 (поскольку он предназначен для нескольких документов, если хотите), но вы всегда можете unlist() его, если вам просто нужен вектор.

[[1]]
[1] "The quick brown fox jumped over the lazy dog\n\nI think cats are really cool\n\n"
[2] "\n    \nHi mom\n\nPurple is my favorite color\n\n"                               
[3] "\n    \nWords\n\nAnd stuff" 

Это можно прочитать обратно в quanteda корпус, используя corpus(mytextSegmented) или tm корпус для последующей обработки.

person Ken Benoit    schedule 18.06.2015
comment
Спасибо! Я попробовал этот метод на моем документе docs[1], который является VCorpus. Я использовал segment(docs[1], what = "other", delimiter = "I want to split after this line!!!") и получил ошибку: нет применимого метода для «сегмента», примененного к объекту класса c («VCorpus», «Corpus»). Какие-нибудь советы? - person src471; 19.06.2015
comment
Да, ваши варианты: а) извлечь тексты из VCorpus, чтобы ваш mytext, как в моем примере, был символьным объектом - и я, честно говоря, не знаю, как это сделать в tm, что является одной из причин, по которой мы разработали quanteda; б) вообще не создавайте VCorpus, просто используйте segment() непосредственно в объекте персонажа векторного источника; или c) использовать segment() в корпусе quanteda, который вы можете создать из своего объекта VCorpus с помощью quanteda::corpus(myVCorpus). Конечно, заменив имена моих примеров на ваши настоящие. - person Ken Benoit; 19.06.2015