Можно ли использовать словарь ANEW для анализа настроений в quanteda?

Я пытаюсь найти способ применения Аффективных норм для английских слов (на голландском языке) для продольного анализа настроений с помощью Quanteda. То, что я в конечном счете хочу иметь, является "средним настроением" в год, чтобы показать любые продольные тенденции.

В наборе данных все слова оцениваются по 7-балльной шкале Лайкерта 64 кодерами по четырем категориям, что дает среднее значение для каждого слова. То, что я хочу сделать, это взять одно из измерений и использовать его для анализа изменений эмоций с течением времени. Я понимаю, что в Quanteda есть функция для реализации LIWC-словаря, но я бы предпочел использовать ANEW-данные с открытым исходным кодом, если это возможно.

По сути, мне нужна помощь с реализацией, потому что я новичок в кодировании и R

Файл ANEW выглядит примерно так (в.csv):

СЛОВО / СЧЕТ: рак: 1,01, картофель: 3,56, любовь: 6,56

1 ответ

Решение

Пока нет, напрямую, но... ANEW отличается от других словарей тем, что не использует формат пары ключ: значение, а назначает числовую оценку каждому термину. Это означает, что вы не учитываете совпадения значений по отношению к ключу, а скорее выбираете объекты, а затем оцениваете их, используя взвешенные значения.

Это может быть сделано в quanteda:

  1. Получить новые функции в вектор символов.

  2. использование dfm(yourtext, select = ANEWfeatures) создать DFM только с новыми функциями.

  3. Умножьте каждое подсчитанное значение на валентность каждого значения ANEW, рециркулируя по столбцам, чтобы количество элементов было умножено на значение ANEW.

  4. использование rowSums() на взвешенной матрице, чтобы получить оценки валентности на уровне документа.

или, в качестве альтернативы,

  1. Задайте вопрос, и мы добавим эту функциональность в Quanteda.

Также обратите внимание, что tidytext использует ANEW для оценки настроений, если вы хотите конвертировать dfm в их объект и использовать этот подход (который в основном является версией того, что я предложил выше).

Обновлено:

Оказывается, я уже встроил нужную вам функцию в quanteda и просто не осознал этого!

Это будет работать Сначала загрузите в словарь ANEW. (Вы должны предоставить файл ANEW самостоятельно.)

# read in the ANEW data
df_anew <- read.delim("ANEW2010All.txt", stringsAsFactors = FALSE)
# construct a vector of weights with the term as the name
vector_anew <- df_anew$ValMn
names(vector_anew) <- df_anew$Word

Теперь, когда у нас есть названный вектор весов, мы можем применить это, используя dfm_weight(), Ниже я сначала нормализовал dfm по относительной частоте, чтобы суммарный балл документа не зависел от длины документа в токенах. Если вы этого не хотите, просто удалите строку, указанную ниже.

library("quanteda")
dfm_anew <- dfm(data_corpus_inaugural, select = df_anew$Word)

# weight by the ANEW weights
dfm_anew_weighted <- dfm_anew %>%
    dfm_weight(scheme = "prop") %>%   # remove if you don't want normalized scores
    dfm_weight(weights = vector_anew)
## Warning message:
## dfm_weight(): ignoring 1,427 unmatched weight features 

tail(dfm_anew_weighted)[, c("life", "day", "time")]
## Document-feature matrix of: 6 documents, 3 features (5.56% sparse).
## 6 x 3 sparse Matrix of class "dfm"
##               features
## docs                 life        day       time
##   1997-Clinton 0.07393220 0.06772881 0.21600000
##   2001-Bush    0.10004587 0.06110092 0.09743119
##   2005-Bush    0.09380645 0.12890323 0.11990323
##   2009-Obama   0.06669725 0.10183486 0.09743119
##   2013-Obama   0.08047970 0          0.19594096
##   2017-Trump   0.06826291 0.12507042 0.04985915

# total scores
tail(rowSums(dfm_anew_weighted))
## 1997-Clinton    2001-Bush    2005-Bush   2009-Obama   2013-Obama   2017-Trump 
##     5.942169     6.071918     6.300318     5.827410     6.050216     6.223944 
Другие вопросы по тегам