【R语言文本挖掘】:情感分析与词云图绘制_情感词云

  • 🌸个人主页:JOJO数据科学
  • 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
  • 💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏
  • ✨本文收录于【R语言数据科学】 本系列主要介绍R语言在文本挖掘领域的应用包括:情感分析、TF-IDF、主题模型等。本系列会坚持完成下去,请大家多多关注点赞支持,一起学习~,尽量坚持每周持续更新,欢迎大家订阅交流学习!

请添加图片描述

引言

在上一章中,我们深入探讨了tidy data的含义,并展示了如何使用这种格式来处理有关词频的问题。这使我们能够分析文档中最常用的单词并比较文档,但现在让我们研究一个不同的问题。让我们讨论情绪分析的主题。当我们阅读一段文本时,我们会利用我们对词语情感意图的理解来推断一段文本是正面的还是负面的,或者可能以其他更细微的情绪为特征,如惊讶或厌恶。 我们可以使用文本挖掘工具以编程方式处理文本的情感内容,如下图所示

image-20220717193903881

上图演示了如何使用 tidytext 进行情感分析的典型文本分析流程图。本章展示了如何使用 tidy data 原则来实现情感分析。

分析文本情感的一种方法是将文本视为单个单词的组合,将整个文本的情感内容视为各个单词的情感内容的总和。这不是进行情绪分析的唯一方法,但它是一种常用的方法,也是一种自然利用整洁工具生态系统的方法。

1.情感数据集

如上所述,存在多种用于评估文本中的观点或情感的方法和字典。 tidytext 包提供了对几个情感词典的访问。三个通用词典是:

  • AFINN
  • bing
  • nrc

所有这三个词典都基于一元词组(unigram),即单个单词。这些词典包含许多英语单词,并且这些单词被分配了正面/负面情绪的分数,也可能是喜悦、愤怒、悲伤等情绪。 nrc 词典以二进制方式(“是”/“否”)将单词分类为积极、消极、愤怒、预期、厌恶、恐惧、快乐、悲伤、惊讶和信任的类别bing词典以二进制方式将单词分为正面和负面类别。 AFINN 词典为单词分配一个介于 -5 和 5 之间的分数,负分表示负面情绪,正分表示正面情绪。

在下载数据之前,我们可能会被要求同意许可。如果在jupyter-notebook里面运行的话会失败,建议大家在rstudio里面先运行下载。

函数 get_sentiments() 允许我们获取特定的情感词典,并为每个词典提供适当的度量。我们现在来看一下各个情绪词典的信息

library(`tidytext`)
library(dplyr)
get_sentiments("nrc") %>% head()

A tibble: 6 × 2

wordsentiment
abacustrust
abandonfear
abandonnegative
abandonsadness
abandonedanger
abandonedfear
get_sentiments("bing") %>% head()

A tibble: 6 × 2

wordsentiment
2-facesnegative
abnormalnegative
abolishnegative
abominablenegative
abominablynegative
abominatenegative
get_sentiments("afinn") %>% head()

A tibble: 6 × 2

wordvalue
abandon-2
abandoned-2
abandons-2
abducted-2
abduction-2
abductions-2

这些词典都是通过整合云资源、餐厅或电影评论等数据的某种组合进行验证。鉴于这些信息,我们可能会犹豫将这些情感词典应用于与它们所验证的文本风格截然不同的文本风格,例如 200 年前的叙事小说,虽然可能这些情感词典来分析之前作家的小说可能不完全准确,但为了方便分析,这里我们还是使用这些词典来进行情感分析.还有一些特定领域的情感词典可用,用于分析来自特定内容领域的文本。后续我们会探讨使用用于金融的情绪词典的分析。

我们通过基于字典的方法通过将文本中每个单词的单独情绪分数相加来找到一段文本的总情绪。

但是并非每个英语单词都在词典中,因为许多英语单词都是相当中性的。重要的是要记住,这些方法不考虑单词前的限定词,例如“no good”或“not true”;像这样的基于词典的方法仅基于 unigrams。如果要根据上下文分析的话,我们需要使用语言模型来解决,这在后续将进行相关介绍。需要注意的是:我们使用累加 unigram 情绪分数的方法可能会受到文本块的大小的影响。 当大段落的文本通常可以具有平均为零的正面和负面情绪,而向几句话句子大小或段落大小的文本通常效果更好。

2.使用内连接进行情感分析

使用tidydata格式的数据,可以将情感分析作为内连接来完成。这是将文本挖掘视为一项整洁的数据分析任务的又一巨大成功;就像删除停用词是一种反连接操作一样,执行情感分析是一种内连接操作。

让我们看一下 NRC 词典中带有joy的单词。Emma中最常见的快乐词是什么?首先,我们需要获取小说的文本,并使用 unnest_tokens() 将文本转换为整洁的格式,就像我们在上一篇文章中所做的那样。让我们还设置一些其他列来跟踪每个单词来自书的哪一行和哪一章;我们使用 group_by 和 mutate 来构造这些列。具体代码如下:

library(janeaustenr)
library(dplyr)
library(stringr)

tidy_books <- austen_books() %>%
  group_by(book) %>%
  mutate(
    linenumber = row_number(),
    chapter = cumsum(str_detect(text, 
                                regex("^chapter [\\divxlc]", 
                                      ignore_case = TrUE)))) %>%#使用正则表达式来定义章节
  ungroup() %>%
  unnest_tokens(word, text)#分词
tidy_books %>% head()

A tibble: 6 × 4

booklinenumberchapterword
Sense & Sensibility10sense
Sense & Sensibility10and
Sense & Sensibility10sensibility
Sense & Sensibility30by
Sense & Sensibility30jane
Sense & Sensibility30austen

注意,我们从 unnest_tokens() 中为输出列选择了名称 word。这是一个方便的选择,因为情感词典和停用词数据集都有名为 word 的列;执行内部连接和反连接因此更容易。
现在文本的格式很整洁,每行一个单词,我们准备好进行情绪分析了。首先,让我们使用 NRC 词典和 filter() 来表示快乐的词。接下来,让我们使用filter来筛选来自 Emma 的单词,然后使用 inner_join() 执行情绪分析。艾玛中最常见的joy是什么?让我们使用 dplyr 中的 count()。

nrc_joy <- get_sentiments("nrc") %>% 
  filter(sentiment == "joy")

tidy_books %>%
    filter(book=='Emma') %>%
    inner_join(nrc_joy) %>%
    count(word,sort=TrUE)%>%
    head()

A tibble: 6 × 2

wordn
good359
friend166
hope143
happy125
love117
deal92

我们在这里看到的大多是关于friendlove的积极、快乐的话语。

我们还可以检查每部小说的情绪如何变化。我们只需几行主要是 dplyr 函数就可以做到这一点。首先,我们使用 Bing 词典和 inner_join() 找到每个单词的情感分数。

接下来,我们计算每本书的某些位置有多少积极和消极的词。这样我们可以分析情绪的变化情况。我们在这里定义一个索引来跟踪我们在叙述中的位置;该索引(使用整数除法)对 80 行文本的部分进行计数。

一小段文本可能没有足够的单词来很好地估计情绪,但对于太大的文本可能会导致正负情绪抵消。对于这些书,使用80行效果很好,但这可能会因单个文本、行的开头长度等而有所不同。然后我们使用 pivot_wider() 以便我们在不同的列中拥有消极和积极的情绪,最后计算净情绪(正面 - 负面)。

library(tidyr)

jane_austen_sentiment <- tidy_books %>%
  inner_join(get_sentiments("bing")) %>%#使用bing情绪词典进行内连接
  count(book, index = linenumber %/% 80, sentiment) %>%#按八十行为一个小段进行记数
  pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) %>%#将数据转换成宽数据 
  mutate(sentiment = positive - negative)#计算净情绪,如果大于0说明是积极情绪,小于0说明是消极的

jane_austen_sentiment %>% head()

A tibble: 6 × 5

bookindexnegativepositivesentiment
Sense & Sensibility0163216
Sense & Sensibility1195334
Sense & Sensibility2123119
Sense & Sensibility3153116
Sense & Sensibility4163418
Sense & Sensibility5165135

现在我们可以在每部小说的情节轨迹上绘制这些情绪分数。请注意,我们绘制在x轴上的索引,是对应的小段文本,即每隔八十行为一段,这也反应了每本书的时间情绪变化

library(ggplot2)

ggplot(jane_austen_sentiment, aes(index, sentiment, fill = book)) +
  geom_col()+#绘制柱形图
  facet_wrap(~book, ncol = 2, scales = "free\_x")#根据不同书进行分面绘图,两行


请添加图片描述

我们可以在上图中看到,每部小说故事情节的情绪变化

3.对比三种情感字典

如何选用不同的情绪词典,我们可能需要更多信息,了解哪一个适合我们研究的目的。现在我们使用三个不同的情感词典,并分析情感在《傲慢与偏见》中是如何变化的。 首先,让我们使用 filter() 从我们感兴趣的一本小说中选择单词。代码如下:

pride_prejudice <- tidy_books %>% 
    filter(book == 'Pride & Prejudice')
pride_prejudice %>% head()

A tibble: 6 × 4

booklinenumberchapterword
Pride & Prejudice10pride
Pride & Prejudice10and
Pride & Prejudice10prejudice
Pride & Prejudice30by
Pride & Prejudice30jane
Pride & Prejudice30austen

我们现在可以使用inner_join()计算不同形式的情感

注意:AFINN词典是通过-5—+5来衡量情感的。而其他两个词典以二进制方式对情感单词进行分类。

# 使用AFINN词典
afinn <- pride_prejudice %>% 
  inner_join(get_sentiments("afinn")) %>% #内连接,得到带有情感的文本
  group_by(index = linenumber %/% 80) %>% #每隔80行作为一小段
  summarise(sentiment = sum(value)) %>% #这里我们进行一个求和处理,因为这里是以数字表示情感的
  mutate(method = "AFINN")

# bing词典
bing <- pride_prejudice %>% 
        inner_join(get_sentiments("bing")) %>%#使用bing词典进行内连接
        mutate(method = "Bing")%>%
        count(index = linenumber %/% 80, sentiment) %>%
  pivot_wider(names_from = sentiment,
              values_from = n,
              values_fill = 0) %>% 
  mutate(sentiment = positive - negative)
# 使用nrc词典
nrc <- pride_prejudice %>% 
        inner_join(get_sentiments("nrc") %>%
        filter(sentiment %in% c('positive','negative'))) %>%
        mutate(method = "NRC")%>%
        count(index = linenumber %/% 80, sentiment) %>%
  pivot_wider(names_from = sentiment,
              values_from = n,


![img](https://img-blog.csdnimg.cn/img_convert/c7719a40a10f0e55e406791638994640.png)
![img](https://img-blog.csdnimg.cn/img_convert/7f10c2e7a50f6814fde0ca4440765d79.png)
![img](https://img-blog.csdnimg.cn/img_convert/ee705e79f214197d0e33f61406e63336.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

= linenumber %/% 80, sentiment) %>%
  pivot_wider(names_from = sentiment,
              values_from = n,


[外链图片转存中...(img-fFGX5F4N-1714261841933)]
[外链图片转存中...(img-BFvVKpIM-1714261841934)]
[外链图片转存中...(img-foKTDlTG-1714261841935)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值