Применение пользовательского (взвешенного) словаря к тексту на основе анализа настроений

Я хочу настроить этот код, чтобы я мог назначить каждому из этих модальных глаголов различный вес. Идея состоит в том, чтобы использовать что-то похожее на библиотеку NRC, где у нас есть «числа» 1-5, представляющие категории, а не числа.

modals<-data_frame(word=c("must", "will", "shall", "should", "may", "can"), 
modal=c("5", "4", "4", "3", "2", "1"))

Моя проблема в том, что когда я запускаю следующий код, у меня 5 "может" считаться такими же, как один "должен". Я хочу, чтобы каждое слово имело разный вес, чтобы при выполнении этого анализа я мог видеть концентрацию использования более сильного «должен» по сравнению с более слабым «можно». * где "tidy.DF" - мой корпус, а "school" и "target" - имена столбцов.

MODAL<-tidy.DF %>%
  inner_join(modals) %>%
  count(School, Target, modal, index=wordnumber %/% 50, modal) %>%
  spread(modal, n, fill=0)

ggplot(MODAL, aes(index, 5, fill=Target)) +
  geom_col(show.legend=FALSE) +
  facet_wrap(~Target, ncol=2, scales="free_x")

person Emily Casey-Wagemaker    schedule 01.02.2019    source источник
comment
Я думаю, что вы ищете применение частота термина — обратная частота документа в ваши документы, а затем умножив его на модальный или создав собственную версию tfidf. Но без полностью воспроизводимого примера и ожидаемого результата вам трудно помочь.   -  person phiver    schedule 11.02.2019


Ответы (1)


Здесь предлагается лучший подход с использованием пакета quanteda. Подход:

  1. Создайте именованный вектор весов, соответствующий вашему «словарю».
  2. Создайте матрицу признаков документа, выбрав только термины из словаря.
  3. Вес наблюдаемых отсчетов.
# set modal values as a named numeric vector
modals <- c(5, 4, 4, 3, 2, 1)
names(modals) <- c("must", "will", "shall", "should", "may", "can")

library("quanteda", warn.conflicts = FALSE)
## Package version: 1.4.0
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.

Я буду использовать самые последние инаугурационные речи в качестве воспроизводимого примера здесь.

dfmat <- data_corpus_inaugural %>%
  corpus_subset(Year > 2000) %>%
  dfm() %>%
  dfm_select(pattern = names(modals))

Это производит необработанные подсчеты.

dfmat
## Document-feature matrix of: 5 documents, 6 features (26.7% sparse).
## 5 x 6 sparse Matrix of class "dfm"
##             features
## docs         will must can should may shall
##   2001-Bush    23    6   6      1   0     0
##   2005-Bush    22    6   7      1   3     0
##   2009-Obama   19    8  13      0   3     3
##   2013-Obama   20   17   7      0   4     0
##   2017-Trump   40    3   1      1   0     0

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

dfm_weight(dfmat, weight = modals)
## Document-feature matrix of: 5 documents, 6 features (26.7% sparse).
## 5 x 6 sparse Matrix of class "dfm"
##             features
## docs         will must can should may shall
##   2001-Bush    92   30   6      3   0     0
##   2005-Bush    88   30   7      3   6     0
##   2009-Obama   76   40  13      0   6    12
##   2013-Obama   80   85   7      0   8     0
##   2017-Trump  160   15   1      3   0     0
person Ken Benoit    schedule 12.02.2019