Есть ли лучший способ игнорировать множественное число, чем «stem = TRUE» в dfm?

#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