Создать 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), эти шаги применяются "вниз по течению" от корпуса, так что корпус остается необработанным набором текстов, к которым будут применяться манипуляции (но сам по себе не будет преобразованным набором текстов), Целью этого является сохранение универсальности, а также содействие воспроизводимости и прозрачности в текстовом анализе.
В ответ на ваши вопросы:
Однако вы можете переопределить наше поощренное поведение, используя
texts(myCorpus) <-
функция, в которой то, что назначено текстам, переопределит существующие тексты. Таким образом, вы можете использовать регулярные выражения для удаления знаков препинания и цифр - например, команды stringi и использование классов Unicode для пунктуации и цифр для идентификации шаблонов.Я бы порекомендовал вам токенизировать перед удалением стоп-слов. Стоп "слова" являются токенами, поэтому нет способа удалить их из текста, прежде чем токенизировать текст. Даже применяя регулярные выражения, чтобы заменить их
""
включает в себя указание некоторой формы границы слова в регулярном выражении - опять же, это токенизация.Чтобы токенизировать в униграммы и биграммы:
токены (myCorpus, ngrams = 1:2)
Чтобы создать DFM, просто позвоните
dfm(myTokens)
, (Вы могли бы также применить шаг 3 для нграмм на этом этапе.
Бонус 1: n=2 словосочетания создает тот же список, что и биграммы, за исключением другого формата. Вы хотели что-то еще? (Отдельный вопрос, возможно?)
Бонус 2: см. dfm_trim(x, sparsity = )
, removeSparseTerms()
варианты довольно запутанные для большинства людей, но это касается и мигрантов из тм. Смотрите этот пост для полного объяснения.
Кстати: использовать texts()
вместо ie2010Corpus$documents$texts
- мы скоро перепишем объектную структуру корпуса, поэтому вам не следует обращаться к его внутренним объектам таким образом, когда есть функция экстрактора. (Кроме того, этот шаг не нужен - здесь вы просто воссоздали корпус.)
Обновление 2018-01:
Новое имя для объекта корпуса data_corpus_irishbudget2010
и функция определения коллокации textstat_collocations()
,