如何从 dfm 获取情绪量表

How to get a sentiment scale from a dfm

对于一个大学项目(在 R 中使用 Quanteda),我正在尝试计算使用 kwic 函数生成的语料库的情感分数。我首先使用 kwic:

创建了想要的语料库
kwicMigration8 <- corpus(kwic(EP8_corp, pattern = dictionary(migration), window=30, valuetype= "glob"))

我认为效果不错,我可以查看文本并且摘要看起来很真实。

summary(kwicMigration8,10)

Corpus consisting of 2834 documents, showing 10 documents:

         Text Types Tokens Sentences from   to   keyword
 text26.1.pre    27     30         2  140  140   borders
 text26.2.pre    27     30         2 1085 1085 migration
 text26.3.pre    24     30         2 1163 1163 migration
 text26.4.pre    27     30         2 1180 1180 migration
 text26.5.pre    27     30         2 1188 1188 migration
 text27.1.pre    25     30         1  665  665    border
 text49.1.pre    23     30         1  284  284   borders
 text68.1.pre    24     30         2   67   67   borders
 text77.1.pre    26     30         2  757  757   borders
 text84.1.pre    27     30         2  673  673    border
 context
     pre
     pre
     pre
     pre
     pre
     pre
     pre
     pre
     pre
     pre

为了开始我的情绪分析,我使用了 Young 和 Soroka 的 Lexicoder 词典:

sentkwicMigration8 <- dfm(kwicMigration8, verbose = T,
remove=stopwords("english"),
dictionary=data_dictionary_LSD2015,
remove_punct = TRUE)

head(sentkwicMigration8)

Document-feature matrix of: 6 documents, 4 features (62.5% sparse) and 6 docvars.
              features
docs           negative positive neg_positive neg_negative
  text26.1.pre        0        1            0            0
  text26.2.pre        1        2            0            0
  text26.3.pre        0        1            0            0
  text26.4.pre        0        3            0            0
  text26.5.pre        1        3            0            0
  text27.1.pre        1        1            0            0

为了创建情绪度量,我随后尝试使用此 logit 量表,但它仅产生 NAs

sentkwicMigration8$sentiment <- log((sentkwicMigration8$positive+0.5)/(sentkwicMigration8$negative+0.5))

summary(sentkwicMigration8$sentiment)
 Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
     NA      NA      NA     NaN      NA      NA    2834 

因为这是一个大学项目,所以我必须使用这种情绪测量,所以我有什么办法可以让它发挥作用吗?

这里的问题是您正在尝试使用 $ 访问 dfm 的列名。这对 dfm 对象来说意味着一些非常不同的东西:它访问文档变量,而不是列名。所以你的 NAs 和 NaNs 来自你正在访问 return NA.

不存在的变量这一事实

您的两个选择是:使用矩阵表示法,或将 dfm 转换为 data.frame。我没有你的输入数据,所以将使用一个等效的例子,你的对象名称。

library("quanteda")
## Package version: 2.0.1

sentkwicMigration8 <- tail(data_corpus_inaugural) %>%
  tokens() %>%
  tokens_lookup(data_dictionary_LSD2015) %>%
  dfm()

sentmat <- log(sentkwicMigration8[, "positive"] + 0.5) -
  log(sentkwicMigration8[, "negative"] + 0.5)
sentmat
## 6 x 1 Matrix of class "dgeMatrix"
##               features
## docs            positive
##   1997-Clinton 0.7102416
##   2001-Bush    0.8604994
##   2005-Bush    0.8987976
##   2009-Obama   0.4819611
##   2013-Obama   0.7756367
##   2017-Trump   0.9555114

# convert to data.frame
data.frame(doc_id = rownames(sentmat), sentiment = as.vector(sentmat))
##         doc_id sentiment
## 1 1997-Clinton 0.7102416
## 2    2001-Bush 0.8604994
## 3    2005-Bush 0.8987976
## 4   2009-Obama 0.4819611
## 5   2013-Obama 0.7756367
## 6   2017-Trump 0.9555114

选项二:

sentkwicMigration8 <- convert(sentkwicMigration8, to = "data.frame")

log((sentkwicMigration8$positive + 0.5) / (sentkwicMigration8$negative + 0.5))
## [1] 0.7102416 0.8604994 0.8987976 0.4819611 0.7756367 0.9555114