Как подсчитать словосочетания в quanteda на основе группирующих переменных?

#r #nlp #quanteda

Вопрос:

Я работал над определением и классификацией словосочетаний над пакетом Quenteda в R.

Например;

Я создаю объект токена из списка документов и применяю анализ словосочетаний.

 toks <- tokens(text$abstracts)
collocations <- textstat_collocations(toks)
 

однако, насколько я могу видеть, нет четкого способа определить, какие словосочетания часто встречаются/существуют в каком документе. Даже если я подам kwic(toks, pattern = phrase(collocations), selection = 'keep' заявку ) результат будет включать только идентификатор строки в виде text1, text2 и т.д.

Я хотел бы сгруппировать результаты анализа словосочетаний на основе документов. возможно ли это с помощью Quanteda ?

Ответ №1:

Похоже, вы хотите подсчитать словосочетания по документам. Вывод из textstat_collocations() уже содержит подсчеты для каждого словосочетания, но они относятся ко всему корпусу.

Таким образом, решение для группировки по документу (или любой другой переменной) состоит в том, чтобы

  1. Получите словосочетания с помощью textstat_collocations() . Ниже я сделал это после удаления стоп-слов и знаков препинания.
  2. Составьте маркеры, из которых были сформированы стоп-слова, используя tokens_compound() . Это преобразует каждую последовательность словосочетаний в один токен.
  3. Сформируйте dfm из составных токенов и используйте textstat_frequency() для подсчета соединений по документам. Это немного сложнее

Реализация с использованием встроенного инаугурационного корпуса:

 library("quanteda")
## Package version: 3.0
## Unicode version: 13.0
## ICU version: 69.1
## Parallel computing: 12 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
library("quanteda.textstats")

toks <- data_corpus_inaugural %>%
  tail(10) %>%
  tokens(remove_punct = TRUE, padding = TRUE) %>%
  tokens_remove(stopwords("en"), padding = TRUE)

colls <- textstat_collocations(toks)
head(colls)
##        collocation count count_nested length   lambda        z
## 1           let us    34            0      2 6.257000 17.80637
## 2  fellow citizens    14            0      2 6.451738 16.18314
## 3 fellow americans    15            0      2 6.221678 16.16410
## 4      one another    14            0      2 6.592755 14.56082
## 5        god bless    15            0      2 8.628894 13.57027
## 6    united states    12            0      2 9.192044 13.22077
 

Теперь мы объединяем их и сохраняем только словосочетания, а затем получаем частоты по документам:

 dfmat <- tokens_compound(toks, colls, concatenator = " ") %>%
  dfm() %>%
  dfm_keep("* *")
 

Этот dfm уже содержит подсчеты по документам каждого словосочетания, но если вы хотите подсчеты в формате data.frame с возможностью группировки, используйте textstat_frequency() . Здесь я вывел только два верхних по документу, но если вы удалите n = 2 их, это даст вам частоты всех словосочетаний по документу.

 textstat_frequency(dfmat, groups = docnames(dfmat), n = 2) %>%
  head(10)
##             feature frequency rank docfreq        group
## 1   nuclear weapons         4    1       1  1985-Reagan
## 2     human freedom         3    2       1  1985-Reagan
## 3        new breeze         4    1       1    1989-Bush
## 4    new engagement         3    2       1    1989-Bush
## 5            let us         7    1       1 1993-Clinton
## 6  fellow americans         4    2       1 1993-Clinton
## 7            let us         6    1       1 1997-Clinton
## 8       new century         6    1       1 1997-Clinton
## 9  nation's promise         2    1       1    2001-Bush
## 10      common good         2    1       1    2001-Bush
 

Комментарии:

1. Классно! Большое спасибо.