Как сделать сложение / вычитание матричных элементов документа в quanteda? - PullRequest
0 голосов
/ 19 мая 2019

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

dfm1 <- tibble(text = c('hello world',
                         'hello quanteda')) %>% 
  corpus() %>% tokens() %>% dfm()
> dfm1
Document-feature matrix of: 2 documents, 3 features (33.3% sparse).
2 x 3 sparse Matrix of class "dfm"
       features
docs    hello world quanteda
  text1     1     1        0
  text2     1     0        1

и

dfm2 <- tibble(text = c('hello world',
                        'good nigth quanteda')) %>% 
  corpus() %>% tokens() %>% dfm()
Document-feature matrix of: 2 documents, 5 features (50.0% sparse).
2 x 5 sparse Matrix of class "dfm"
       features
docs    hello world good nigth quanteda
  text1     1     1    0     0        0
  text2     0     0    1     1        1

Как видите, у нас одинаковые текстовые идентификаторы в двух dfms: text1 и text2.

Я бы хотел "вычесть" dfm2 в dfm1, чтобы каждая запись в dfm1 вычиталась из ее (возможно) совпадающей записи в dfm2 (тот же текст, то же слово)

Так, например, в text1, hello происходит 1 раз, а в text2 это также происходит 1 раз.Таким образом, выход должен иметь 0 для этой записи (то есть: 1-1).Конечно, записи, которые не находятся в обоих dfms, должны быть оставлены без изменений.

Как я могу сделать это в Quanteda?

1 Ответ

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

Вы можете сопоставить набор функций dfm с набором функций другого dfm, используя dfm_match(). Я также привел в порядок ваш код, поскольку для этого короткого примера некоторые из ваших конвейеров могут быть упрощены.

library("quanteda")
## Package version: 1.4.3
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.

dfm1 <- dfm(c("hello world", "hello quanteda"))
dfm2 <- dfm(c("hello world", "good night quanteda"))

as.dfm(dfm1 - dfm_match(dfm2, features = featnames(dfm1)))
## Document-feature matrix of: 2 documents, 3 features (33.3% sparse).
## 2 x 3 sparse Matrix of class "dfm"
##        features
## docs    hello world quanteda
##   text1     0     0        0
##   text2     1     0        0

as.dfm() происходит от того факта, что оператор + определен для родительского разреженного класса Matrix , а не специально для quanteda dfm, поэтому он отбрасывает dfm класс и превращает его в dgCMatrix. Принудительное возвращение его в dfm с помощью as.dfm() решает эту проблему, но при этом удаляются исходные атрибуты объектов dfm, таких как docvars.

...