Создать DFM шаг за шагом с Quanteda

Я хочу проанализировать большой (n=500 000) корпус документов. я использую quanteda в ожидании, что будет быстрее, чем tm_map() от tm, Я хочу продолжить шаг за шагом, а не использовать автоматический способ с dfm(), У меня есть причины для этого: в одном случае я не хочу разбивать токены перед удалением стоп-слов, так как это приведет ко многим бесполезным биграммам, в другом случае я должен предварительно обработать текст с помощью специфических для языка процедур.

Я хотел бы, чтобы эта последовательность была реализована:
1) убрать знаки препинания и цифры
2) удалить стоп-слова (т.е. перед токенизацией, чтобы избежать ненужных токенов)
3) токенизировать с помощью униграмм и биграмм
4) создать дфм

Моя попытка:

> library(quanteda)
> packageVersion("quanteda")
[1] ‘0.9.8’
> text <- ie2010Corpus$documents$texts
> text.corpus <- quanteda:::corpus(text, docnames=rownames(ie2010Corpus$documents))

> class(text.corpus)
[1] "corpus" "list"

> stopw <- c("a","the", "all", "some")
> TextNoStop <- removeFeatures(text.corpus, features = stopw)
# Error in UseMethod("selectFeatures") : 
# no applicable method for 'selectFeatures' applied to an object of class "c('corpus', 'list')"

# This is how I would theoretically continue: 
> token <- tokenize(TextNoStop, removePunct=TRUE, removeNumbers=TRUE)
> token2 <- ngrams(token,c(1,2))

Бонусный вопрос Как мне удалить редкие токены в quanteda? (т.е. эквивалент removeSparseTerms() в tm,


ОБНОВЛЕНИЕ В свете ответа @Ken, здесь приведен код, который необходимо выполнить шаг за шагом quanteda:

library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’

1) Удалить пользовательские знаки препинания и цифры. Например, обратите внимание, что "\n" в корпусе ie2010

text.corpus <- ie2010Corpus
texts(text.corpus)[1]      # Use texts() to extrapolate text
# 2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery.\nIt is

texts(text.corpus)[1] <- gsub("\\s"," ",text.corpus[1])    # remove all spaces (incl \n, \t, \r...)
texts(text.corpus)[1]
2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery. It is of e

Еще одно замечание о причине, по которой можно предпочесть предварительную обработку. Мой нынешний корпус на итальянском языке, на котором есть статьи, связанные со словами с апострофом. Таким образом, прямой dfm() может привести к неточному токенизации. например:

broken.tokens <- dfm(corpus(c("L'abile presidente Renzi. Un'abile mossa di Berlusconi"), removePunct=TRUE))

создаст два отдельных токена для одного и того же слова ("un'abile" и "l'abile"), следовательно, потребуется дополнительный шаг с gsub() Вот.

2) В quanteda невозможно удалить стоп-слова непосредственно в тексте перед токенизацией. В моем предыдущем примере "l" и "un" должны быть удалены, чтобы не вводить в заблуждение биграммы. Это может быть обработано в tm с tm_map(..., removeWords),

3) токенизация

token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2)

4) Создайте DFM:

dfm <- dfm(token)

5) Удалить редкие функции

dfm <- trim(dfm, minCount = 5)

1 ответ

Решение

Мы разработали dfm() не как "черный ящик", а скорее как швейцарский армейский нож, который сочетает в себе многие параметры, которые обычные пользователи хотят применять при преобразовании своих текстов в матрицу документов и функций. Однако все эти опции также доступны через команды обработки более низкого уровня, если вы хотите обеспечить более точный уровень контроля.

Однако один из принципов проектирования Quanteda заключается в том, что текст становится "особенностями" только в процессе токенизации. Если у вас есть набор токенизированных функций, которые вы хотите исключить, вы должны сначала токенизировать свой текст, иначе вы не можете исключить их. В отличие от других текстовых пакетов для R (например, tm), эти шаги применяются "вниз по течению" от корпуса, так что корпус остается необработанным набором текстов, к которым будут применяться манипуляции (но сам по себе не будет преобразованным набором текстов), Целью этого является сохранение универсальности, а также содействие воспроизводимости и прозрачности в текстовом анализе.

В ответ на ваши вопросы:

  1. Однако вы можете переопределить наше поощренное поведение, используя texts(myCorpus) <- функция, в которой то, что назначено текстам, переопределит существующие тексты. Таким образом, вы можете использовать регулярные выражения для удаления знаков препинания и цифр - например, команды stringi и использование классов Unicode для пунктуации и цифр для идентификации шаблонов.

  2. Я бы порекомендовал вам токенизировать перед удалением стоп-слов. Стоп "слова" являются токенами, поэтому нет способа удалить их из текста, прежде чем токенизировать текст. Даже применяя регулярные выражения, чтобы заменить их "" включает в себя указание некоторой формы границы слова в регулярном выражении - опять же, это токенизация.

  3. Чтобы токенизировать в униграммы и биграммы:

    токены (myCorpus, ngrams = 1:2)

  4. Чтобы создать DFM, просто позвоните dfm(myTokens), (Вы могли бы также применить шаг 3 для нграмм на этом этапе.

Бонус 1: n=2 словосочетания создает тот же список, что и биграммы, за исключением другого формата. Вы хотели что-то еще? (Отдельный вопрос, возможно?)

Бонус 2: см. dfm_trim(x, sparsity = ), removeSparseTerms() варианты довольно запутанные для большинства людей, но это касается и мигрантов из тм. Смотрите этот пост для полного объяснения.

Кстати: использовать texts() вместо ie2010Corpus$documents$texts - мы скоро перепишем объектную структуру корпуса, поэтому вам не следует обращаться к его внутренним объектам таким образом, когда есть функция экстрактора. (Кроме того, этот шаг не нужен - здесь вы просто воссоздали корпус.)

Обновление 2018-01:

Новое имя для объекта корпуса data_corpus_irishbudget2010и функция определения коллокации textstat_collocations(),

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