如何从 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 对象来说意味着一些非常不同的东西:它访问文档变量,而不是列名。所以你的 NA
s 和 NaN
s 来自你正在访问 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
对于一个大学项目(在 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 对象来说意味着一些非常不同的东西:它访问文档变量,而不是列名。所以你的 NA
s 和 NaN
s 来自你正在访问 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