Как рассчитать соотношение слов по дням в квантеде? - PullRequest
1 голос
/ 09 мая 2019

Рассмотрим этот простой пример.

tibble(text = c('a grande latte with soy milk',
                'black coffee no room',
                'latte is a latte',
                'coke, diet coke'),
       myday = c(ymd('2018-01-01','2018-01-01','2018-01-03','2018-01-03'))) %>% 
  corpus() %>% 
  tokens() %>% 
  dfm()
Document-feature matrix of: 4 documents, 14 features (71.4% sparse).
4 x 14 sparse Matrix of class "dfm"
       features
docs    a grande latte with soy milk black coffee no room is coke , diet
  text1 1      1     1    1   1    1     0      0  0    0  0    0 0    0
  text2 0      0     0    0   0    0     1      1  1    1  0    0 0    0
  text3 1      0     2    0   0    0     0      0  0    0  1    0 0    0
  text4 0      0     0    0   0    0     0      0  0    0  0    2 1    1

Мне интересно получить долю слова coffee, агрегированную по дням.

То есть для дня 2018-01-01 мы можем видеть, что есть 10 слов (a grande latte with soy milk black coffee noroom) и coffee упоминается только один раз.Таким образом, пропорция составляет 1/10.То же самое для других дней.

Как я могу сделать это в quanteda?Конечно, идея состоит в том, чтобы избежать материализации разреженной матрицы в плотную матрицу.

Спасибо!

1 Ответ

1 голос
/ 10 мая 2019

Это просто и является частью базового quanteda решения о дизайне для передачи через ваши документы от объекта корпуса к "нисходящим" объектам, таким как dfm. Вы можете решить эту проблему, используя dfm_group() с помощью myday docvar и затем взвешивая.

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

library("quanteda")
## Package version: 1.4.3
library("tibble")
library("lubridate")

dfmat <- tibble(
  text = c(
    "a grande latte with soy milk",
    "black coffee no room",
    "latte is a latte",
    "coke, diet coke"
  ),
  myday = c(ymd("2018-01-01", "2018-01-01", "2018-01-03", "2018-01-03"))
) %>%
  corpus() %>%
  tokens() %>%
  dfm()

Теперь для получения желаемого результата достаточно двух операций.

dfmat2 <- dfm_group(dfmat, groups = "myday") %>%
  dfm_weight(scheme = "prop")
dfmat2
## Document-feature matrix of: 2 documents, 14 features (42.9% sparse).
## 2 x 14 sparse Matrix of class "dfm"
##             features
## docs             a grande latte with soy milk black coffee  no room    is
##   2018-01-01 0.100    0.1  0.10  0.1 0.1  0.1   0.1    0.1 0.1  0.1 0    
##   2018-01-03 0.125    0    0.25  0   0    0     0      0   0    0   0.125
##             features
## docs         coke     ,  diet
##   2018-01-01 0    0     0    
##   2018-01-03 0.25 0.125 0.125

dfmat2[, "coffee"]
## Document-feature matrix of: 2 documents, 1 feature (50.0% sparse).
## 2 x 1 sparse Matrix of class "dfm"
##             features
## docs         coffee
##   2018-01-01    0.1
##   2018-01-03    0
...