Я хочу проанализировать большой (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)
quanteda
, используя функциюtexts()
: - person 000andy8484   schedule 16.08.2016