#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()
уже содержит подсчеты для каждого словосочетания, но они относятся ко всему корпусу.
Таким образом, решение для группировки по документу (или любой другой переменной) состоит в том, чтобы
- Получите словосочетания с помощью
textstat_collocations()
. Ниже я сделал это после удаления стоп-слов и знаков препинания. - Составьте маркеры, из которых были сформированы стоп-слова, используя
tokens_compound()
. Это преобразует каждую последовательность словосочетаний в один токен. - Сформируйте 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. Классно! Большое спасибо.