Объединить корпус в тм 0.7.3

Использование пакета интеллектуального анализа текста tm для R следующие версии работают в версии 0.6.2, R версии 3.4.3:

library(tm)
a = "This is the first document."
b = "This is the second document."
c = "This is the third document."
d = "This is the fourth document."
docs1 = VectorSource(c(a,b))
docs2 = VectorSource(c(c,d))
corpus1 = Corpus(docs1)
corpus2 = Corpus(docs2)
corpus3 = c(corpus1,corpus2)
inspect(corpus3)
<<VCorpus>>
Metadata:  corpus specific: 0, document level (indexed): 0
Content:  documents: 4

Тем не менее, тот же код в tm версия 0.7.3 (версия 3.4.2 R) выдает ошибку:

Error in UseMethod("inspect", x) :
  no applicable method for 'inspect' applied to an object of class "list"

В соответствии с vignette("tm",package="tm"), c() функция перегружена:

Множество стандартных операторов и функций ([, [<-, [[, [[<-, c(), lapply()) доступны для корпусов с семантикой, аналогичной стандартным подпрограммам R. Например, c() объединяет две (или более) корпуса. Применительно к нескольким текстовым документам он возвращает корпус. Метаданные автоматически обновляются, если корпуса объединяются (т. Е. Объединяются).

Однако для новой версии это, очевидно, уже не так. Как объединить две тела в tm 0.7.3? Очевидное решение состоит в том, чтобы сначала объединить документы, а затем создать корпус, но я ищу решение для объединения двух уже существующих корпораций.

1 ответ

Решение

У меня нет большого опыта работы с tm пакет, так что мой ответ может не хватить некоторого нюанса в понимании SimpleCorpus против VCorpus против других tm классы объектов.

Входы для вашего звонка c класс SimpleCorpus; это не похоже на tm поставляется с c Метод специально для этого класса. Таким образом, метод отправки не вызывает правильное c объединить Корпора так, как вы хотите. Тем не менее, есть c метод для VCorpus учебный класс (tm:::c.VCorpus).

Есть 2 разных способа преодолеть проблему принуждения corpus3 к list, но они, кажется, приводят к различным структурам. Я представляю оба ниже и оставляю это на ваше усмотрение, если они достигают вашей конечной цели.

1) Вы можете позвонить tm:::c.VCorpus непосредственно при определении corpus3:

> library(tm)
> 
> a = "This is the first document."
> b = "This is the second document."
> c = "This is the third document."
> d = "This is the fourth document."
> docs1 = VectorSource(c(a,b))
> docs2 = VectorSource(c(c,d))
> corpus1 = Corpus(docs1)
> corpus2 = Corpus(docs2)
> 
> corpus3 = tm:::c.VCorpus(corpus1,corpus2)
> 
> inspect(corpus3)
<<VCorpus>>
Metadata:  corpus specific: 2, document level (indexed): 0
Content:  documents: 4

[1] This is the first document.  This is the second document. This is the third document. 
[4] This is the fourth document.

2) Вы можете использовать VCorpus при определении corpus1 & corpus2:

> library(tm)
> 
> a = "This is the first document."
> b = "This is the second document."
> c = "This is the third document."
> d = "This is the fourth document."
> docs1 = VectorSource(c(a,b))
> docs2 = VectorSource(c(c,d))
> corpus1 = VCorpus(docs1)
> corpus2 = VCorpus(docs2)
> 
> corpus3 = c(corpus1,corpus2)
> 
> inspect(corpus3)
<<VCorpus>>
Metadata:  corpus specific: 0, document level (indexed): 0
Content:  documents: 4

[[1]]
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 27

[[2]]
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 28

[[3]]
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 27

[[4]]
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 28
Другие вопросы по тегам