Интерпретация dfm_weight (схема = 'проп') с группами (квантеда) - PullRequest
1 голос
/ 02 июля 2019

Я смотрю на различные варианты взвешивания, используя dfm_weight.Если я выберу schema = 'prop' и сгруппирую texttat_frequency по location, какова правильная интерпретация слова в каждой группе?

Скажем, в Нью-Йорке термин career равен 0,6, а в Бостоне слово team равно 4,0, как я могу интерпретировать эти числа?

    corp=corpus(df,text_field = "What are the areas that need the most improvement at our company?") %>% 
  dfm(remove_numbers=T,remove_punct=T,remove=c(toRemove,stopwords('english')),ngrams=1:2) %>%
  dfm_weight('prop') %>% 
  dfm_replace(pattern=as.character(lemma$first),replacement = as.character(lemma$X1)) %>% 
  dfm_remove(pattern = c(paste0("^", stopwords("english"), "_"), paste0("_", stopwords("english"), "$")), valuetype = "regex")
freq_weight <- textstat_frequency(corp, n = 10, groups = c("location"))


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) +
  labs(x = NULL, y = "Relative frequency")

1 Ответ

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

Правильное толкование состоит в том, что это сумма исходных пропорций термина в документе, но суммированная по группам. Это не очень естественная интерпретация, поскольку она суммирует пропорции, и вы не знаете, на скольких терминах была основана пропорция (в абсолютной частоте), прежде чем она была суммирована.

quanteda <1.4 запретил это, но после <a href="https://github.com/quanteda/quanteda/issues/1646" rel="nofollow noreferrer"> обсуждения мы включили его (но пусть пользователь остерегается).

library("quanteda")
#> Package version: 1.4.3
corp <- corpus(c("a b b c c", 
                 "a a b", 
                 "b b c",
                 "c c c d"),
               docvars = data.frame(grp = c(1, 1, 2, 2)))
dfmat <- dfm(corp) %>%
    dfm_weight(scheme = "prop")
dfmat
#> Document-feature matrix of: 4 documents, 4 features (43.8% sparse).
#> 4 x 4 sparse Matrix of class "dfm"
#>        features
#> docs            a         b         c    d
#>   text1 0.2000000 0.4000000 0.4000000 0   
#>   text2 0.6666667 0.3333333 0         0   
#>   text3 0         0.6666667 0.3333333 0   
#>   text4 0         0         0.7500000 0.25

Теперь мы можем сравнить textstat_frequency() с группами и без. (Ни то, ни другое не имеет смысла.)

# sum across the corpus
textstat_frequency(dfmat, groups = NULL)
#>   feature frequency rank docfreq group
#> 1       c 1.4833333    1       3   all
#> 2       b 1.4000000    2       3   all
#> 3       a 0.8666667    3       2   all
#> 4       d 0.2500000    4       1   all

# sum across groups
textstat_frequency(dfmat, groups = "grp")
#>   feature frequency rank docfreq group
#> 1       a 0.8666667    1       2     1
#> 2       b 0.7333333    2       2     1
#> 3       c 0.4000000    3       1     1
#> 4       c 1.0833333    1       2     2
#> 5       b 0.6666667    2       1     2
#> 6       d 0.2500000    3       1     2

Если после группировки вам нужны были относительные термины частоты, то вы можете сначала сгруппировать dfm, а затем взвесить его следующим образом:

dfmat2 <- dfm(corp) %>%
    dfm_group(groups = "grp") %>%
    dfm_weight(scheme = "prop")

textstat_frequency(dfmat2, groups = "grp")
#>   feature frequency rank docfreq group
#> 1       a 0.3750000    1       1     1
#> 2       b 0.3750000    1       1     1
#> 3       c 0.2500000    3       1     1
#> 4       c 0.5714286    1       1     2
#> 5       b 0.2857143    2       1     2
#> 6       d 0.1428571    3       1     2

Теперь термин «частоты» суммирует в группе 1,0, что делает их интерпретацию более естественной, поскольку они рассчитаны по групповым подсчетам, а не по групповым пропорциям.

...