【问题标题】:Can the ANEW dictionary be used for sentiment analysis in quanteda?ANEW 字典可以用于 quanteda 中的情感分析吗?
【发布时间】:2017-10-23 06:13:24
【问题描述】:

我正在尝试找到一种方法来实施英语单词(荷兰语)的情感规范,以便使用 Quanteda 进行纵向情感分析。我最终想要的是每年的“平均情绪”,以显示任何纵向趋势。

在数据集中,所有单词 a 由 64 位编码员在四个类别中以 7 点李克特量表评分,这为每个单词提供了一个平均值。我想做的是取其中一个维度,并用它来分析情绪随时间的变化。我意识到 Quanteda 具有实现 LIWC 字典的功能,但如果可能的话,我更喜欢使用开源 ANEW-data。

基本上,我在实施方面需要帮助,因为我是编码和 R 的新手

ANEW 文件看起来像这样(在 .csv 中):

单词/分数:癌症:1.01,土豆:3.56,爱情:6.56

【问题讨论】:

  • Quanteda 可以使用各种格式的任何字典。你当然可以做到。如果您在实施它时遇到一些困难。您可以询问更多详细信息。
  • 你说得对,Quanteda 可以实现以下格式:LIWC、Yaml、Yoshikoder、Lexicoder 和 YAML,但 ANEW 不是其中之一。本质上,我需要帮助的是实施,因为我是 R 和编码新手。
  • 如果你给我一个字典文件并提供示例数据,我可以展示一个简单的例子。

标签: r nlp sentiment-analysis quanteda


【解决方案1】:

还没有,直接,但是... ANEW 与其他字典不同,因为它不使用键:值对格式,而是为每个术语分配一个数字分数。这意味着您不是针对某个键计算值的匹配项,而是选择特征,然后使用加权计数对它们进行评分。

这可以通过以下方式在 quanteda 中完成:

  1. 将 ANEW 特征添加到字符向量中。

  2. 使用 dfm(yourtext, select = ANEWfeatures) 创建仅具有 ANEW 功能的 dfm。

  3. 将每个计数值乘以每个 ANEW 值的化合价,按列循环,以便每个特征计数乘以其 ANEW 值。

  4. 在加权矩阵上使用rowSums() 以获得文档级效价分数。

或者,

  1. 提交issue,我们会将此功能添加到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 

【讨论】:

  • 非常感谢您的帮助!我将尝试破解代码以解决您的解决方案中的第 3 点 - 希望它会解决。
  • 首先非常感谢您的支持!我可以运行代码,直到“加权”出现以下错误:“错误:*(, ) 的尚未实现的方法。->> 要求包作者实现缺少的功能. 另外: 警告消息: In dfm_weight(., weights = vector_anew) :" 此错误消息后跟所有单词作为一个字符串:“ignoringaalaalmoesaandachtigaangenaamaanslagaanstootaantrekkelij”(我在荷兰语中使用 ANEW)当我查看向量时文字和重量一切看起来都很好。
  • 更新!我将 txt 文件更改为 excel,这次我运行代码时出现了同样的错误,但这次创建了 dfm_anew_weighted 变量。
  • 这不是错误消息,只是警告,但我在下一个版本的代码中使它更友好。它告诉您在 dfm 中找不到 ANEW 字典中的 1,427 个功能(在 v0.9.9.50 中,它会将它们全部粘贴到警告中......)。仍然产生正确的结果。如果您想停止这种情况,只需将 weights 参数更改为 weights = vector_anew[names(vector_anew) %in% featnames(dfm_anew)]
  • 非常感谢您的有用帮助和快速反应。我实现了您在我用于分析的语料库中建议的代码,它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多