Как выбрать только подмножество корпусных терминов для создания TermDocumentMatrix в TM

У меня огромный корпус, и меня интересует только появление нескольких терминов, которые я знаю заранее. Есть ли способ создать матрицу документа термина из корпуса, используя tm пакет, где должны использоваться только те термины, которые я указал заранее?

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

2 ответа

Решение

Вы можете изменить корпус так, чтобы он содержал только нужные вам термины, создав пользовательскую функцию преобразования. Смотрите Виньетка для tm пакет и помощь для content_transformer функция для получения дополнительной информации:

library(tm)

# Create a corpus from the text listed below
corp = VCorpus(VectorSource(doc))

# Custom function to keep only the terms in "pattern" and remove everything else
(f <- content_transformer(function(x, pattern) 
  regmatches(x, gregexpr(pattern, x, perl=TRUE, ignore.case=TRUE))))

(К вашему сведению, вторая строка кода чуть выше адаптирована из этого SO ответа.)

# The pattern we'll search for
keep = "sleep|dream|die"

# Run the transformation function using the pattern above
tm_map(corp, f, keep)[[1]]

Вот результат запуска функции преобразования:

<<PlainTextDocument (metadata: 7)>>
  c("die", "sleep", "sleep", "die", "sleep", "sleep", "Dream")

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

doc = "To be, or not to be, that is the question—
Whether 'tis Nobler in the mind to suffer
The Slings and Arrows of outrageous Fortune,
Or to take Arms against a Sea of troubles,
And by opposing, end them? To die, to sleep—
No more; and by a sleep, to say we end
The Heart-ache, and the thousand Natural shocks
That Flesh is heir to? 'Tis a consummation
Devoutly to be wished. To die, to sleep,
To sleep, perchance to Dream; Aye, there's the rub"

Еще один способ фильтрации корпуса; Сначала присвойте свою ценность мета части, скажем, языку; Зацикливая элементы корпуса с переменной i, отметьте все, что вы хотите, а затем отфильтруйте, используя эти метаатрибуты.

corpusz[[i]]$meta["language"] <- 'tur'

idx <- meta(corpusz, "language") ==  'tur'
filtered <- corpusz[idx]

Теперь фильтр содержит только те элементы корпуса, которые мы хотим.

Другие вопросы по тегам