Создать 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
.
ОБНОВИТЬ В свете ответа @ Кена, вот код, чтобы продолжить шаг за шагом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)