Понимание того, как работает dfm_groups без добавления группы - PullRequest
0 голосов
/ 09 июля 2019

Построение этого вопроса: Интерпретация dfm_weight (схема = 'проп' ') с группами (quanteda)

Если у меня есть функция:

     plot_topterms = function(data,text_field,n,...){

  corp=corpus(data,text_field = text_field) %>% 
    dfm(remove_numbers=T,remove_punct=T,remove=c(stopwords('english')),ngrams=1:2) %>%
    dfm_weight(scheme ='prop') %>% 
    dfm_group(groups=...) %>% 
    dfm_replace(pattern=as.character(lemma$first),replacement = as.character(lemma$X1)) %>% 
    dfm_remove(pattern = c(paste0("^", stopwords("english"), "_"), paste0("_", stopwords("english"), "$")), valuetype = "regex") %>% 
    dfm_remove(toRemove)
  freq_weight <- textstat_frequency(corp, n = n)

  ggplot(data = freq_weight, aes(x = nrow(freq_weight):1, y = frequency)) +
    geom_bar(stat='identity')+
    facet_wrap(~ group, scales = "free") +
    coord_flip() +
    scale_x_continuous(breaks = nrow(freq_weight):1,
                       labels = freq_weight$feature) +
    #scale_y_continuous(labels = scales::percent)+
    theme(text = element_text(size=20))+
    labs(x = NULL, y = "Relative frequency")
}

и я не передаю группирующую переменную, поэтому я делаю что-то вроде:

plot_topterms(df,textField,n=10)

Я получаю вывод с групповой переменной, равной all. Это должно быть эквивалентно тому, чтобы строка dfm_group не была правильной? И если это так, если у меня есть относительная частота 60 для слова fun, означает ли это, что 60% всех документов содержат это слово?

1 Ответ

1 голос
/ 10 июля 2019

Ваша интерпретация группы "все" верна. Эффект не указания groups в textstat_frequency() заключается в том, что по умолчанию для группы будет установлено значение «все». В вашей функции вы никогда не передадите аргумент groups в вызове этой функции, так что он всегда будет "all", даже если вы уже сгруппировали dfm через вызов dfm_group() внутри вашей функции plot_topterms().

Значение 60 для объекта на этом графике будет означать, что сумма относительных частот термина (в документе) для этого объекта равна 60. Если вы посмотрите на вопрос, на который вы ссылаетесь выше , то вы посмотрим, как это работает для простого примера. Относительная частота a в text1 составляла 0,20 и 0,67 в text2, поэтому textstat_frequency() суммирует эти два в 0,87. Ваш 60 аналогичен этому 0,87.

Это , а не , такое же, как частота документов, которая представляет собой количество документов, в которых появилась функция (хотя бы один раз). Если вы хотите знать частоты документа объектов (что и было вашим толкованием), то вы должны составлять график docfreq из возврата textstat_frequency, а не frequency.

Однако я бы отметил, что plot_topterms() не является хорошо продуманной функцией.

  • Он опирается на несколько переменных, которые не являются локальными для функций, а именно toRemove и lemma.

  • Он не будет правильно передавать ... в вызове dfm_group(). Вместо этого вы должны явно указать аргумент groups в сигнатуре функции.

Если бы мы разрабатывали новую функцию для пакета, мы бы создали новую функцию textplot_frequency(), которая построила график возврата из textstat_frequency(), который в основном реализовал только вызов ggplot() после того, как пользователь построил объект textstat_frequency , Это может более разумно использовать групповую переменную, встроенную в каждый textstat_frequency объект, так что те, в которых единственной группой является «all», будут отображать это как один фасет.

...