Пошаговое создание dfm с помощью quanteda

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

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

Моя попытка:

> 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)

person 000andy8484    schedule 13.08.2016    source источник
comment
Чтобы завершить ответ, можно проделать шаг за шагом в quanteda, используя функцию texts():   -  person 000andy8484    schedule 16.08.2016


Ответы (1)


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

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

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

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

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

  3. Для токенизации в униграммы и биграммы:

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

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

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

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

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

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

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

person Ken Benoit    schedule 14.08.2016
comment
Большое спасибо, @Ken. Я пропустил эту texts() функцию. - person 000andy8484; 16.08.2016
comment
Пожалуйста! Для нескольких версий texts <- был отключен, но я понял, что многие люди сочтут заменяющую функцию полезной. (Надеюсь, они будут использовать это ответственно!) - person Ken Benoit; 16.08.2016