本文由来
为了赚足学分丰富假期生活,初衷是分析老师对学生作业的评价和学生对老师的评价的。本来这个任务是在N多天前就应该完成了,无奈本人懒癌晚期+拖延症不想治疗,不是因为火烧眉毛就绝对没有今天的文章。本文旨在记录自己的学习过程,就这样,开干啦!
序幕
既然题目是“基于情感词典的文本情感分析”,那么情感词典就是必不可少的了。对于情感词典的要求:要包含积极的词语和消极的词语、每一种类的数量要足够多、包含足够广的范围。由此,拥有一个好的词典是非常有必要的。然后才是如何进行情感分析。
强大的snowNLP
其实就在今天,我发现了snowNLP这个Python的三方库,它可以方便的处理中文文本的内容,它有以下功能:
- 中文分词
- 词性标注
- 情感分析
- 文本分类
- 文本转拼音
- 繁体转简体
- 提取文本关键词
- 提取文本摘要
- 分割成句子
- 文本相似
很强大的有没有,膜拜作者大神。纵观这么多的功能真是让人眼花缭乱,其实这个题目只需要情感分析这一个功能就够了,情感分析的功能是:你给它一个句子,它给你一个positive值。比如你向它传递“你今天真的好美”,它会返回你“0.9838430726152845”,这个值就代表了“你今天真的好美”这句话有多么的positive,即这句话有多么的积极、正向,这就很符合题目的要求好不好。
安装snowNLP
强烈推荐这种方式!!!其实就本题目而言个人认为不安装snowNLP库会更方便一点,只要将下载的压缩包( 提取码:c6qz )解压后复制到pycharm的项目文件夹下就可以了,也可以点击这里下载我的程序文件(提取码:xeng),下载完解压后后使用pycharm打开emotion_analysis文件夹就可以了。
除了上面的方法,也可以正经安装。到目前为止snowNLP的最新版本是0.12.3,可以在终端下使用 pip install snownlp==0.12.3
来安装,如果是使用anaconda管理Python包的话可以使用conda install --channel https://conda.anaconda.org/roccqqck snownlp
安装,因为网络的问题我安装了好几次都没有成功,conda install snownlp
的方式也不好使,可以换一种方式安装,首先到官网手动下载snowNLP的压缩包,.zip或.tar.gz格式的,不想去官网下载的话可以点击百度云链接,提取码:pl3e ,解压,我解压到了桌面,之后打开Anaconda Prompt,cd到解压之后的文件夹内,如图,
依次输入python setup.py build
和python setup.py install
,等待完成即可。
测试snowNLP
就在我满心欢喜的认为这次终于轻松加愉快地完成了任务的时候,positive当即给了我一jio,我测试了几组常见的语句,发现函数返回的positive值和现实差了八万十千里,在一阵慌乱中查阅了资料,发现原本的库训练的数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,心想之前的大费周章不是全白费了嘛。接着我又阅读了关于情感分析部分的源码,发现了解决的办法。
解决办法
话不多说,直接上代码:
class Sentiment(object):
def __init__(self):
self.classifier = Bayes()
def save(self, fname, iszip=True):
self.classifier.save(fname, iszip)
def load(self, fname=data_path, iszip=True):
self.classifier.load(fname, iszip)
def handle(self, doc):
words = seg.seg(doc)
words = normal.filter_stop(words)
return words
def train(self, neg_docs, pos_docs):
data = []
for sent in neg_docs:
data.append([self.handle(sent), 'neg'])
for sent in pos_docs:
data.append([self.handle(sent), 'pos'])
self.classifier.train(data)
def classify(self, sent):
ret, prob = self.classifier.classify(self.handle(sent))
if ret == 'pos':
return prob
return 1 - prob
classifier = Sentiment()
classifier.load()
def train(neg_file, pos_file):
neg_docs = codecs.open(neg_file, 'r', 'utf-8').readlines()
pos_docs = codecs.open(pos_file, 'r', 'utf-8').readlines()
global classifier
classifier = Sentiment()
classifier.train(neg_docs, pos_docs)
def save(fname, iszip=True):
classifier.save(fname, iszip)
def load(fname, iszip=True):
classifier.load(fname, iszip)
def classify(sent):
return classifier.classify(sent)
我在源码中关于情感分析的部分看到了train函数,并且函数的参数也简单明了。通过源码可以看到,snowNLP的sentiment模块是支持训练的,只需要将表示消极意义的文本和表示积极意思的文本当做参数传入到train函数中,然后再利用save函数保存训练好的文件即可,虽然我不知道源码的意思,但依据函数的命名和sentiment文件夹下文件的命名,我大胆地试了一下,果然可以训练文件。
成果
说了这么多没用的就是为了凑篇幅,下面来点重要的。
from snownlp import sentiment
sentiment.train('ntusd-negative.txt', 'ntusd-positive.txt')
sentiment.save('sentiment.marshal')
上面的是训练函数, 'ntusd-negative.txt',与'ntusd-positive.txt'分别是消极的与积极的词典文件名字,sentiment.train('ntusd-negative.txt', 'ntusd-positive.txt')
调用了sentiment模块下的train函数,用于训练情感词典,sentiment.save('sentiment.marshal')
用于保存训练好的文件,保存的文件名字叫“ sentiment.marshal .3”,是一个.marshal.3文件,虽说上面写的是“ sentiment.marshal ”,但因为是Python3的缘故,会自动在文件后面加上“.3”,用以区分Python3之前版本产生的文件,但在程序中使用该文件时不需要添加“.3”,程序会自动在文件后面加上“.3”,别问我是怎么知道的。
训练完后就要让程序引用我们训练的文件,上代码:
# data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
# 'sentiment.marshal')
data_path = ("E:/emotion_analysis/sentiment.marshal")
在sentiment文件夹内有一个__init__.py文件,修改其中data_path的值,将之前的代码注释掉,将data_path改为绝对路径,即 sentiment.marshal 所在的位置,比如我的 sentiment.marshal放在“E:/emotion_analysis/sentiment.marshal”,就把data_path改为“ E:/emotion_analysis/sentiment.marshal ”。
上面的都完成后,就要测试了,不说话了,上代码
from snownlp import SnowNLP
s = SnowNLP("你今天真的好美")
print(s.sentiments)
下面的是结果
关于情感词典
本文用到的情感词典是融合了N多位大牛整理出的词典,包括清华大学——李军中文褒贬义词典、台湾大学NTUSD、知网Hownet等等。请点击此处( 提取码:0fz8 )下载本文用到的情感词典,可也点击此处 (提取码:xeng) 下载我的完整程序。
写在最后
虽然这篇博客看起来很low,事实上也真的很low,不过看在这是我的第一篇博客的份上就凑合着看吧,关于snowNLP的源码到现在我也没有看懂,在这里立一个flag,三天之内看懂源码!
最后的最后
关于文本情感分析还有一种方法,就是给每一个词语赋予一个权值,越积极权值越大,越消极权值越小。处理文本时先分词,去掉一些不重要的词,对剩余的词语进行处理,不过这种方法我不会,具体可以参考这篇博客的上半部分。