文本挖掘|R语言助力简·奥斯丁部分作品的情感分析
文本挖掘之情感分析
整理文本进行情感分析是典型的文本分析案例,当打算深度阅读一篇文章时,可以利用我们对单词的情感意图的理解来推断一篇文章是积极的还是消极的,或者其他可能带有一些更微妙的情感特征,比如惊讶或厌恶。最近特别好奇读文学相关的本科生或者硕士生到底毕业论文是写啥,从网上了解一番之后发现,部分文科生的毕业论文是这样的,《从Jane Austen个人感情经历来看<傲慢与偏见>中体现的爱情婚姻观》、《某某作家部分作品及其爱情观的分析》、《浅析某某作家笔下的人物性格魅力:以xxx为例》~
为了深入了解文本挖掘工具以编程方式处理文本的情感内容,让我们谈谈观点挖掘或情绪分析的话题。分析文本情感思路是把文本看成多个单词的情感内容的组合,把整个文本的情感内容看成单词的情感内容的总和。典型文本分析的思维导图:
01
关于情感数据集
tidytext包提供了对几种情感词汇的访问集。有三种通用词汇:
AFINN 词典是Finn Årup Nielsen创建的,把单词的分值范围控制在-5到5之间,负数表示消极情绪,正数表示积极情绪。bing词典是Bing Liu 和collaborators等创建,以二进制方式把单词分为积极和消极两种类型。nrc词典是Saif Mohammad和Peter Turney提供的,以二进制的方式(“是”/“不是”)将词汇分为积极、消极、愤怒、期待、厌恶、恐惧、喜悦、悲伤、惊讶和信任。
函数get_sentiments()允许我们获得特定的一定度量情感词汇。
get_sentiments("bing")
02
内部连接的情绪分析
文本被整理为整洁文本Tidy Text的数据后,情绪分析就可以作为一个内部连接来完成。就像删除停止字是反连接操作一样,执行情绪分析也是一个内部连接操作。我们还是以Jane Austen简·奥斯丁代表作为案例,在文本挖掘| 某作者文章的词频统计排序中已经阐述如何通过unner_tokens获得整洁文本,接下来,使用group_by和mutate来构造一些列来记录每一个单词来自书中的哪一行和哪一章,再建立内连接情感数据集。
jane_austen_sentiment<-tidy_books_stop
%>%inner_join(get_sentiments("bing"))
%>%count(book,index=linenumber%/%80,sentiment)
%>%spread(sentiment,n,fill=0)
%>%mutate(sentiment=positive-negative)
代码含义:
使用Bing词典和inner_join()找到每个词的情绪分数,接下来,计算在每本书的定义部分中有多少积极和消极的词,定义了一个索引index跟踪我们正在计算的80行文本中的积极和消极情绪,最终使用整数除法计算80行文本的节数。%/%操作符执行整数除法(x %/% y等于底数(x/y))。使用spread(),可以在不同的列中有积极和消极的情绪,最后计算一个净情绪(正-负)。
我们来看一下处理前tidy_books_stop和处理后jane_austen_sentiment的数据变化。
03
绘图
在x轴上对索引进行绘图,让索引跟踪文本部分的叙述时间,了解叙事弧中情感是如何变化的。
ggplot(jane_austen_sentiment,aes(index,sentiment,fill=book))
+geom_col()+facet_wrap(~book,ncol=3,scales="free_x")
从图中可看出,每一部小说的情节是如何在故事的轨迹上向着积极或消极的情绪变化的。比如《傲慢与偏见》这本书中,在index50-75之间的文章内容还是比较积极向上的,基本没有消极情绪,心情不太好的人,可以优先阅读这几章的故事情节。
04
主要的积极词和消极词计数
利用count()计算一下tidy_books_stop这个数据集中每个词出现的次数。
>word_counts <- tidy_books_stop %>%
inner_join(get_sentiments("bing")) %>%
count(word, sentiment, sort = TRUE) %>%
ungroup()
>word_counts
05
主要的积极词和消极词可视化
选择word_counts中n排名前20的词,绘制条形图
>counts<-word_counts %>%
group_by(sentiment) %>%
top_n(20) %>%
ungroup() %>%
mutate(word = reorder(word, n))
>counts
>ggplot(counts,aes(word, n, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment,ncol=1,scales = "free_y") +
labs(y = "Number sentiment words",x ="Words") +
coord_flip()
为了方便观察Words,让scales分面后的坐标系根据y轴调整之后不设定ncol,删除ncol=1之后如图:
很显然,从图中可以看出“miss”这个词被认为是否定的词,但在Jane Austen的作品中,它被用来称呼年轻的未婚女性。miss这个词在情绪分析时出现异常,可以把miss这个加入停止词中,在语料库构建过程中,通过删除停止词而不被统计。那么如何把miss这个词加入停止词词典中呢?
使用bind_rows()轻松地将“miss”添加到LXL的停止词列表中。
LXL_stop_words <- bind_rows(tibble(word = c("miss"), lexicon = c("lxl")), stop_words)
View(LXL_stop_words)
- zookeeper学习系列:三、利用zookeeper做选举和锁
- Spring Cloud构建微服务架构:分布式服务跟踪(收集原理)【Dalston版】
- zookeeper学习系列:二、api实践
- Spring Cloud构建微服务架构:分布式服务跟踪(整合logstash)【Dalston版】
- Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】
- 困扰我多年的Connection reset问题
- scala学习笔记
- jersey处理支付宝异步回调通知的问题:java.lang.IllegalArgumentException: Error parsing media type 'application/x-www
- 使用 Java Service Wrapper 启动java后台进程服务
- PHP码农在Golang压力下的生存之道-PHP性能优化实践
- golang使用 mongo
- CoreOS Linux引入了Kubernetes kubelet
- gwt之mvc4g
- 来自1000多个项目的10大JavaScript错误浅析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 放弃fastjson,拥抱Jackson
- Spring入门
- 贪心-HDU1789 Doing Homework again(活动安排问题)
- flink实战-实时计算平台通过api停止流任务
- JAVA初级岗面试知识点——基础篇
- flink实战-flink streaming sql 初体验
- flink实战教程-使用set实时计算当天网站uv
- 贪心-HDU3348 coins(钱币问题)
- 归并排序详解 -HDU4911 Inversion(逆序对)
- 数据结构与算法——稀疏数组
- Maven安装配置详细教程
- 数据结构与算法——冒泡排序
- MyBatis Generator逆向工程-你还在手写mapper吗?
- JSR303后端校验详解
- SSM整合开发实战 SSM-MALL