Почему имена подвигов (myDFM) содержат функции более чем одного или двух токенов?
Я работаю с большим 1М корпусом документов и применил несколько преобразований при создании из него матрицы частоты документа:
library(quanteda)
corpus_dfm <- dfm(tokens(corpus1M), # where corpus1M is already a corpus via quanteda::corpus()
remove = stopwords("english"),
#what = "word", #experimented if adding this made a difference
remove_punct = T,
remove_numbers = T,
remove_symbols = T,
ngrams = 1:2,
dictionary = lut_dict,
stem = TRUE)
Затем, чтобы посмотреть на полученные функции:
dimnames(corpus_dfm)$features
[1] "abandon"
[2] "abandoned auto"
[3] "abandoned vehicl"
...
[8] "accident hit and run"
...
[60] "assault no weapon aggravated injuri"
Почему эти функции имеют длину больше 1:2? Стемминг, кажется, был успешным, но жетоны - это предложения, а не слова.
Я попытался настроить свой код для этого: dfm(tokens(corpus1M, what = "word")
но не было никаких изменений.
Я попытался сделать крошечный воспроизводимый пример:
library(tidyverse) # just for the pipe here
example_text <- c("the quick brown fox",
"I like carrots",
"the there that etc cats dogs") %>% corpus
Тогда, если я применяю тот же DFM, как указано выше:
> dimnames(corpus_dfm)$features
[1] "etc."
Это было удивительно, потому что почти все слова были удалены? Даже стоп-слова в отличие от ранее, так что я больше запутался! Я также сейчас не могу создать воспроизводимый пример, хотя я просто пытаюсь это сделать. Может быть, я неправильно понял, как работает эта функция?
Как я могу создать DFM в Quanteda, где есть только 1:2 слова токены и где удаляются стоп-слова?
1 ответ
Первый вопрос: почему функция (имена) в dfm так долго?
Ответ: потому что применение словаря в dfm()
call заменяет совпадения с вашими униграммами и функциями биграммы на ключи словаря, и (многие из) ключи в вашем словаре состоят из нескольких слов. Пример:
lut_dict[70:72]
# Dictionary object with 3 key entries.
# - assault felony:
# - asf
# - assault misdemeanor:
# - asm
# - assault no weapon aggravated injury:
# - anai
Второй вопрос: в воспроизводимом примере, почему почти все слова пропали?
Ответ: потому что единственное совпадение значения словаря с функциями в dfm было "и т. Д." категория.
corpus_dfm2 <- dfm(tokens(example_text), # where corpus1M is already a corpus via quanteda::corpus()
remove = stopwords("english"),
remove_punct = TRUE,
remove_numbers = TRUE,
remove_symbols = TRUE,
dictionary = lut_dict,
ngrams = 1:2,
stem = TRUE, verbose = TRUE)
corpus_dfm2
# Document-feature matrix of: 3 documents, 1 feature (66.7% sparse).
# 3 x 1 sparse Matrix of class "dfmSparse"
# features
# docs etc.
# text1 0
# text2 0
# text3 1
lut_dict["etc."]
# Dictionary object with 1 key entry.
# - etc.:
# - etc
Если вы не применяете словарь, то вы видите:
dfm(tokens(example_text), # the "tokens" is not necessary here
remove = stopwords("english"),
remove_punct = TRUE,
remove_numbers = TRUE,
remove_symbols = TRUE,
ngrams = 1:2,
stem = TRUE)
# Document-feature matrix of: 3 documents, 18 features (66.7% sparse).
# 3 x 18 sparse Matrix of class "dfmSparse"
# features
# docs quick brown fox the_quick quick_brown brown_fox like carrot i_like
# text1 1 1 1 1 1 1 0 0 0
# text2 0 0 0 0 0 0 1 1 1
# text3 0 0 0 0 0 0 0 0 0
# features
# docs like_carrot etc cat dog the_there there_that that_etc etc_cat cat_dog
# text1 0 0 0 0 0 0 0 0 0
# text2 1 0 0 0 0 0 0 0 0
# text3 0 1 1 1 1 1 1 1 1
Если вы хотите, чтобы функции не соответствовали, то замените dictionary
с thesaurus
, Ниже вы увидите, что токен "etc" был заменен на верхний регистр "ETC.":
dfm(tokens(example_text),
remove = stopwords("english"),
remove_punct = TRUE,
remove_numbers = TRUE,
remove_symbols = TRUE,
thesaurus = lut_dict,
ngrams = 1:2,
stem = TRUE)
Document-feature matrix of: 3 documents, 18 features (66.7% sparse).
3 x 18 sparse Matrix of class "dfmSparse"
features
docs quick brown fox the_quick quick_brown brown_fox like carrot i_like
text1 1 1 1 1 1 1 0 0 0
text2 0 0 0 0 0 0 1 1 1
text3 0 0 0 0 0 0 0 0 0
features
docs like_carrot cat dog the_there there_that that_etc etc_cat cat_dog ETC.
text1 0 0 0 0 0 0 0 0 0
text2 1 0 0 0 0 0 0 0 0
text3 0 1 1 1 1 1 1 1 1