查看原文
其他

使用R语言绘制文本数据情感历时趋势图

大邓 大邓和他的Python
2024-09-09

使用 R 计算卫报中涉及政府内容的情感历时变化,计算步骤

  1. 导入数据、
  2. 保留涉及政府的内容;确定政府关键词,保留政府关键词出现位置窗口距离内的所有词语
  3. 情感计算,使用LSD2015中的正、负两类词表, 统计正、负情感词出现次数
  4. 绘制出卫报中涉及政府情感的历时可视化图

1. 导入数据

该语料库包含 2012 年至 2016 年的 6,000 篇卫报新闻文章。

library(quanteda)
library(quanteda.corpora)

corp_news <- readRDS("data/data_corpus_guardian.RDS")

2. 保留涉及政府的内容

确定政府关键词,保留政府关键词出现位置窗口距离内的所有词语

# 分词
toks_news <- tokens(corp_news, remove_punct = TRUE)

#政府相关词
gov <- c("government", "cabinet", "prime minister")

# 政府gov词出现位置前后10个词都保留
# note: 使用 phrase() 构建词组
toks_gov <- tokens_keep(toks_news, pattern = phrase(gov), window = 10)

3. 情感计算

使用 data_dictionary_LSD2015 情感词典

lengths(data_dictionary_LSD2015)

Run

negative     positive neg_positive neg_negative 
2858         1709         1721         2860 

data_dictionary_LSD2015词典中有四个词表,只使用前两个,即 negative 和 positive


# 只使用 negative 和 positive
data_dictionary_LSD2015_pos_neg <- data_dictionary_LSD2015[1:2]

# toks_gov中属于positive词表的词语出现几次, positive就是几;同理,negative;
toks_gov_lsd <- tokens_lookup(toks_gov,
dictionary = data_dictionary_LSD2015_pos_neg)

# 构建文档特征矩阵, 并将date进行分组
dfmat_gov_lsd <- dfm(toks_gov_lsd) %>%
dfm_group(groups = date)

dfmat_gov_lsd

Run

Document-feature matrix of: 1,453 documents, 2 features (36.89% sparse) and 3 docvars.
            features
docs         negative positive
  2012-01-02        2        0
  2012-01-04        0        0
  2012-01-05        0        1
  2012-01-06        0        0
  2012-01-07        1        0
  2012-01-11        4        4
[ reached max_ndoc ... 1,447 more documents ]

4. 可视化

图表详情

  • x轴日期
  • y轴词频
  • 图中的柱为每天中的正、负词出现次数

由此绘制出卫报中涉及政府情感的历时可视化图。

matplot(dfmat_gov_lsd$date, dfmat_gov_lsd, type = "l", lty = 1, col = 1:2,
ylab = "Frequency", xlab = "")
grid()
legend("topleft", col = 1:2, legend = colnames(dfmat_gov_lsd), lty = 1, bg = "white")

通过获取正面词和负面词的频率之间的差异来计算每日情绪分数。

plot(dfmat_gov_lsd$date, dfmat_gov_lsd[,"positive"] - dfmat_gov_lsd[,"negative"],
type = "l", ylab = "Sentiment", xlab = "")
grid()
abline(h = 0, lty = 2)

上面两幅图太粗糙了, 可以应用内核平滑处理下情感值,更清楚地显示卫报中涉及政府的情感变化趋势。

dat_smooth <- ksmooth(x = dfmat_gov_lsd$date,
y = dfmat_gov_lsd[,"positive"] - dfmat_gov_lsd[,"negative"],
kernel = "normal", bandwidth = 30)
plot(dat_smooth$x, dat_smooth$y, type = "l", ylab = "Sentiment", xlab = "")
grid()
abline(h = 0, lty = 2)

数据下载

  • https://tutorials.quanteda.io/advanced-operations/targeted-dictionary-analysis/





精选文章

管理世界 | 使用文本分析词构建并测量短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

支持开票 | Python实证指标构建与文本分析

金融研究 | 文本相似度计算与可视化

金融研究 | 使用Python构建「关键审计事项信息含量」

视频分享 | 文本分析在经管研究中的应用

转载 | 金融学文本大数据挖掘方法与研究进展

文本分析 | 「MD&A信息含量」指标构建代码实现

可视化 | 绘制《三体》人物关系网络图

长期征稿 | 欢迎各位前来投稿

17G数据集 | 深交所企业社会责任报告

70G数据集 | 上市公司定期报告数据集

27G数据集 | 使用Python对27G招股说明书进行文本分析

数据集 | 585w企业工商注册信息

数据集 | 90w条中国上市「公司高管数据

可视化 | 绘制《三体》人物关系网络图

MS | 使用网络算法识别『创新的颠覆性与否

认知的测量 | 向量距离vs语义投影

Asent库 | 英文文本数据情感分析

PNAS | 文本网络分析&文化桥梁Python代码实现

PNAS | 使用语义距离测量一个人的「创新力(发散思维)得分

tomotopy | 速度最快的LDA主题模型

100min视频 | Python文本分析与会计

安装python包出现报错:Microsoft Visual 14.0 or greater is required. 怎么办?

如何正确读入文本数据不乱码(解决文本乱码问题)

Faker库 | 生成实验数据

继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存