Подмножество / выбрать из DFM, используя словарь в Quanteda - PullRequest
0 голосов
/ 16 октября 2018

У меня есть набор текстов из разных стран.Я пытаюсь увидеть, как часто в текстах встречается конкретный термин для каждой страны.Для этого я следую приведенному ниже примеру: https://quanteda.io/articles/pkgdown/examples/plotting.html#frequency-plots

freq_grouped <- textstat_frequency(dfm(full_corpus), 
                                   groups = "Country")

freq_const <- subset(freq_grouped, freq_grouped$feature %in% "constitution")

Это прекрасно работает, за исключением того, что в нем фиксируется только точный термин ("конституция").Я хотел бы иметь возможность фиксировать вариации термина (например, «Хартия прав и свобод»), использовать глобусы (например, «*constitution*») и подсчитывать результаты в той же категории.Я пытался использовать словарь для этого, но я получаю ноль результатов.

dict <- dictionary(list(constitution = c('*constitution*', 'charter of rights and freedoms', 
                                         'canadian charter', 'constituição*', '*constitucion*')))

freq_const <- subset(freq_grouped, freq_grouped$feature %in% dict)

freq_const
    [1] feature   frequency rank      docfreq   group    
    <0 rows> (or 0-length row.names)

Как мне добиться этого?

1 Ответ

0 голосов
/ 17 октября 2018

Основной ответ заключается в том, что вы не можете поднастроить dfm, используя словарь или любой другой тип сопоставления с образцом, потому что dfm_subset() требует логического значения для его сопоставления подмножества, которое соответствует 1: 1 с документами .Словарь будет соответствовать функциям, а не документам.

Если вы хотите соответствовать функциям , не выбирая при этом документы - что, я думаю, то, что вы хотели - тогда вы можете использовать dfm_select(), а словарь quanteda является допустимым входным параметром для аргумента pattern этой команды.С аргументом valuetype = "glob", кроме того, вы можете указать, что ваше сопоставление с шаблоном является глобусом, а не регулярным выражением.

library("quanteda")

subdfm <- dfm(data_corpus_inaugural) %>%
    dfm_select(pattern = dict, valuetype = "glob")

head(subdfm)
## Document-feature matrix of: 6 documents, 5 features (66.7% sparse).
## 6 x 5 sparse Matrix of class "dfm"
##                  features
## docs              constitutional constitution constitutions constitutionally unconstitutional
##   1789-Washington              1            1             0                0                0
##   1793-Washington              1            1             0                0                0
##   1797-Adams                   0            8             1                0                0
##   1801-Jefferson               1            2             0                0                0
##   1805-Jefferson               0            6             0                0                0
##   1809-Madison                 0            1             0                0                0

textstat_frequency(subdfm)
##            feature frequency rank docfreq group
## 1     constitution       206    1      37   all
## 2   constitutional        53    2      24   all
## 3    constitutions         4    3       3   all
## 4 constitutionally         4    4       3   all
## 5 unconstitutional         3    5       3   all

Если у вас есть документы для корпуса, из которого вы создаете dfm, вы также можетепередать их на вызов textstat_frequency() - они будут присоединены к dfm.

...