#r #nlp #quanteda
#r #nlp #quanteda
Вопрос:
Я предварительно обрабатываю свои данные для запуска модели LDA. Мне было интересно, есть ли лучший способ игнорировать множественное число (например, «ставки», «скорость», «против», «страны»), чем использование «stem = TRUE»? Я не хочу ограничивать все слова, а только некоторые конкретные слова, которые часто встречаются во множественном или единственном числе.
Любой намек?
Я пробовал, "stem = TRUE"
и я также создал словарь и использовал "dictonary=dict"
его в коде dfm, но он, очевидно, захватывает только слова из словаря.
Ответ №1:
Лучший способ сделать это — использовать инструмент для пометки ваших существительных во множественном числе, а затем преобразовать их в единственное число. В отличие от решения stemmer, это не приведет к появлению таких слов, как stemming to stem или quickly to quick и т. Д.
Я рекомендую использовать для этого пакет spacyr, который хорошо интегрируется с quanteda. Вот пример:
library("quanteda")
## Package version: 1.4.3
library("spacyr")
txt <- c(
"Plurals in English can include irregular words such as stimuli.",
"One mouse, two mice, one house, two houses."
)
txt_parsed <- spacy_parse(txt, tag = TRUE)
## Found 'spacy_condaenv'. spacyr will use this environment
## successfully initialized (spaCy Version: 2.1.3, language model: en)
## (python options: type = "condaenv", value = "spacy_condaenv")
txt_parsed
## doc_id sentence_id token_id token lemma pos tag entity
## 1 text1 1 1 Plurals plural NOUN NNS
## 2 text1 1 2 in in ADP IN
## 3 text1 1 3 English English PROPN NNP LANGUAGE_B
## 4 text1 1 4 can can VERB MD
## 5 text1 1 5 include include VERB VB
## 6 text1 1 6 irregular irregular ADJ JJ
## 7 text1 1 7 words word NOUN NNS
## 8 text1 1 8 such such ADJ JJ
## 9 text1 1 9 as as ADP IN
## 10 text1 1 10 stimuli stimulus NOUN NNS
## 11 text1 1 11 . . PUNCT .
## 12 text2 1 1 One one NUM CD CARDINAL_B
## 13 text2 1 2 mouse mouse NOUN NN
## 14 text2 1 3 , , PUNCT ,
## 15 text2 1 4 two two NUM CD CARDINAL_B
## 16 text2 1 5 mice mouse NOUN NNS
## 17 text2 1 6 , , PUNCT ,
## 18 text2 1 7 one one NUM CD CARDINAL_B
## 19 text2 1 8 house house NOUN NN
## 20 text2 1 9 , , PUNCT ,
## 21 text2 1 10 two two NUM CD CARDINAL_B
## 22 text2 1 11 houses house NOUN NNS
## 23 text2 1 12 . . PUNCT .
# replace token with lemma for plural nouns
txt_parsed$token <- ifelse(txt_parsed$tag == "NNS",
txt_parsed$lemma,
txt_parsed$token
)
(Конечно, есть много способов выполнить эту условную замену, включая dplyr.)
Теперь слова, являющиеся существительными во множественном числе, были заменены их вариантами с одним существительным, включая неправильные, такие как стимулы и мыши, которые ни один основатель не был бы достаточно умен, чтобы понять.
dfmat <- dfm(as.tokens(txt_parsed), remove_punct = TRUE)
dfmat
## Document-feature matrix of: 2 documents, 14 features (50.0% sparse).
## 2 x 14 sparse Matrix of class "dfm"
## features
## docs plural in english can include irregular word such as stimulus one
## text1 1 1 1 1 1 1 1 1 1 1 0
## text2 0 0 0 0 0 0 0 0 0 0 2
## features
## docs mouse two house
## text1 0 0 0
## text2 2 2 2