Я хочу проанализировать большой (n = 500 000) корпус документов. Я использую quanteda
в ожидании, что will be faster чем tm_map()
от tm
. Я хочу продолжить шаг за шагом, вместо автоматического использования с dfm()
. У меня есть причины для этого: в одном случае я не хочу tokenize перед удалением стоп-слов, так как это приведет к множеству бесполезных bigrams, а в другом я должен предварительно обработать текст с помощью специфических для языка процедур.Создайте dfm шаг за шагом с помощью quanteda
Я хотел бы эту последовательность, чтобы быть реализован:
1) удалить знаки препинания и цифры
2) удалить стоп-слова (то есть до токенизации, чтобы избежать ненужных маркеров)
3) токенизировать использование юниграмм и биграммы
-) создать 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))
Bonus вопрос Как удалить разреженные токены в quanteda
? (Т. Е эквивалент removeSparseTerms()
в tm
UPDATE В свете @ ответ Кена, вот код, следовать шаг за шагом с quanteda
:
library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’
1) Удалить пользовательские пунктуация и цифры. Например. обратите внимание, что «\ п» в 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)
Чтобы завершить ответ, вы можете шаг за шагом перейти в 'quanteda' с помощью функции' text() ': – 000andy8484