最近学会利用Python做了几个词云后,又应用NLP中情感分析,结合snownlp库完成了词云分类,做了积极和消极两类词云,效果图如下。
之后我对NLP的知识产生了兴趣,继续深挖,发现王树义老师的这个项目很符合我的口味,于是尝试撸之,下面记录过程。
1. 背景知识
情绪分析(emotional analysis)和情感分析(sentiment analysis)有相似之处。
相同之处是都是通过脚本对文本进行自动化分析,来获得情感的趋向。
不同之处情感分析的结果一般分为正向(positive)和负向(negative),而情绪分析包含的种类就比较多了。
加拿大国家研究委员会(National Research Council of Canada)官方发布的情绪词典包含了8种情绪,分别为:
- 愤怒(anger)
- 期待(anticipation)
- 厌恶(disgust)
- 恐惧(fear)
- 喜悦(joy)
- 悲伤(sadness)
- 惊讶(surprise)
- 信任(trust)
有了这些情绪的标记,可以轻松地对一段文本的情绪变化进行分析。
这个项目中,需要用到Python和R。这两种语言在目前数据科学领域里最受欢迎。Python的优势在于通用,而R的优势在于统计学家组成的社区。这些统计学家真是高产,也很酷,经常制造出令人惊艳的分析包。
这里就用Python来做前期的数据清理使得数据符合我们的要求便于处理,然后再将处理后的数据导入R的工作环境用R做情绪分析,并且把结果可视化输出。
2. 准备数据
项目中数据来源是《权利的游戏》第三季的第9集——“The Rains of Castamere”。
https://genius.com/Game-of-thrones-the-rains-of-castamere-annotated
只需要全选剧本拷贝,然后创建个txt文本文件把内容粘贴进去,现在你就有可供分析的文本了。
再将文本放入你的工作目录中。
Python
我们需要用到 Jupyter Notebook
R
我们需要用到 R studio
3. 数据清理
我们首先需要清理文本数据,完成以下这两个任务:
- 把与剧情正文无关的,对我们做情绪分析没有用处的内容去除,;
- 将数据转换成R可以直接做情绪分析的结构化数据格式,如csv格式。
(以下操作在Jupyter Notebook中完成)
首先需要导入需要的工具包,这里导入数据分析中常用包pandas和re正则包
import pandas as pd
import re
然后读取当前目录下的剧本文本。
with open("权游.txt") as f:
data = f.read()
print(data)
输出结果:
[Opening Credits]
[First scene shows the location of Casterly Rock (ancestral seat of House Lannister) on a giant map of Westeros. There are several game pieces representing different House sigils located on different parts of the map.ROBB STARK and CATELYN STARK are at a campsite, within a tent lit up by candles]
...
数据正确读入。下面我们把正文以外的文本内容去掉。即去掉开头和结尾的非剧本正文内容。
Python split()方法
- 描述
Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
- 语法
split() 方法语法:
str.split(str="", num=string.count(str)).
- 参数
str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num – 分割次数。默认为 -1, 即分隔所有。
- 返回值
返回分割后的字符串列表。
data =data.split('[Opening Credits]')