美文网首页gensim分词算法情感分析
利用Python实现中文情感极性分析

利用Python实现中文情感极性分析

作者: atLee | 来源:发表于2017-05-18 15:53 被阅读2679次

    情感极性分析,即情感分类,对带有主观情感色彩的文本进行分析、归纳。情感极性分析主要有两种分类方法:基于情感知识的方法基于机器学习的方法。基于情感知识的方法通过一些已有的情感词典计算文本的情感极性(正向或负向),其方法是统计文本中出现的正、负向情感词数目或情感词的情感值来判断文本情感类别;基于机器学习的方法利用机器学习算法训练已标注情感类别的训练数据集训练分类模型,再通过分类模型预测文本所属情感分类。本文采用机器学习方法实现对酒店评论数据的情感分类,利用Python语言实现情感分类模型的构建和预测,不包含理论部分,旨在通过实践一步步了解、实现中文情感极性分析。

    1 开发环境准备

    1.1 Python环境

    在python官网https://www.python.org/downloads/ 下载计算机对应的python版本,本人使用的是Python2.7.13的版本。后面,因为想要使用CNN算法与SVM算法结果进行比对,使用到了Tensorflow模块,而此模块在Windows系统中只有Python35版本,因此又加装了Python3.5的版本,即一台电脑同时存在连个python版本,可以分开使用。

    在本实例中前面直到SVM算法的实现都在Python27下完成,仅CNN算法在Python35下完成,特此说明。

    1.2 第三方模块

    本实例代码的实现使用到了多个著名的第三方模块,主要模块如下所示:

    2 数据获取

    2.1 停用词词典

    本文使用中科院计算所中文自然语言处理开放平台发布的中文停用词表,包含了1208个停用词。下载地址:http://www.hicode.cc/download/view-software-13784.html

    2.2 正负向语料库

    文本从http://www.datatang.com/data/11936 下载“有关中文情感挖掘的酒店评论语料”作为训练集与测试集,该语料包含了4种语料子集,本文选用正负各1000的平衡语料(ChnSentiCorp_htl_ba_2000)作为数据集进行分析。

    3 数据预处理

    3.1 正负向语料预处理

    下载并解压ChnSentiCorp_htl_ba_2000.rar文件,得到的文件夹中包含neg(负向语料)和pos(正向语料)两个文件夹,而文件夹中的每一篇评论为一个txt文档,为了方便之后的操作,需要把正向和负向评论分别规整到对应的一个txt文件中,即正向语料的集合文档(命名为2000_pos.txt)和负向语料的集合文档(命名为2000_neg.txt)。
    具体Python实现代码如下所示:

    1_process--文档处理代码

    运行完成后得到2000_pos.txt和2000_neg.txt两个文本文件,分别存放正向评论和负向评论,每篇评论为一行。文档部分截图如下所示:

    酒店评论截图

    3.2 中文文本分词

    本文采用结巴分词分别对正向语料和负向语料进行分词处理。特别注意,在执行代码前需要把txt源文件手动转化成UTF-8格式,否则会报中文编码的错误。在进行分词前,需要对文本进行去除数字、字母和特殊符号的处理,使用python自带的stringre模块可以实现,其中string模块用于处理字符串操作,re模块用于正则表达式处理。
    具体实现代码如下所示:

    2_cutsentence--结巴分词代码

    处理完成后,得到2000_pos_cut.txt和2000_neg_cut.txt两个txt文件,分别存放正负向语料分词后的结果。分词结果部分截图如下所示:

    分词结果截图

    3.3 去停用词

    分词完成后,即可读取停用词表中的停用词,对分词后的正负向语料进行匹配并去除停用词。去除停用词的步骤非常简单,主要有两个:

    • 1)读取停用词表;
    • 2)遍历分词后的句子,将每个词丢到此表中进行匹配,若停用词表存在则替换为空。

    具体实现代码如下所示:

    3_stopword--去除停用词代码

    根据代码所示,停用词表的获取使用到了python特有的广播形式,一句代码即可搞定:

    stopkey = [w.strip() for w in codecs.open('data\stopWord.txt', 'r', encoding='utf-8').readlines()]
    

    读取出的每一个停用词必须要经过去符号处理即w.strip(),因为读取出的停用词还包含有换行符和制表符,如果不处理则匹配不上。代码执行完成后,得到2000_neg_cut_stopword.txt和2000_pos_cut_stopword.txt两个txt文件。

    由于去停用词的步骤是在句子分词后执行的,因此通常与分词操作在同一个代码段中进行,即在句子分词操作完成后直接调用去停用词的函数,并得到去停用词后的结果,再写入结果文件中。本文是为了便于步骤的理解将两者分开为两个代码文件执行,各位可根据自己的需求进行调整。

    3.4 获取特征词向量

    根据以上步骤得到了正负向语料的特征词文本,而模型的输入必须是数值型数据,因此需要将每条由词语组合而成的语句转化为一个数值型向量。常见的转化算法有Bag of Words(BOW)、TF-IDF、Word2Vec。本文采用Word2Vec词向量模型将语料转换为词向量。

    由于特征词向量的抽取是基于已经训练好的词向量模型,而wiki中文语料是公认的大型中文语料,本文拟从wiki中文语料生成的词向量中抽取本文语料的特征词向量。Wiki中文语料的Word2vec模型训练在之前写过的一篇文章“利用Python实现wiki中文语料的word2vec模型构建” 中做了详尽的描述,在此不赘述。即本文从文章最后得到的wiki.zh.text.vector中抽取特征词向量作为模型的输入。

    获取特征词向量的主要步骤如下:

    • 1)读取模型词向量矩阵;
    • 2)遍历语句中的每个词,从模型词向量矩阵中抽取当前词的数值向量,一条语句即可得到一个二维矩阵,行数为词的个数,列数为模型设定的维度;
    • 3)根据得到的矩阵计算矩阵均值作为当前语句的特征词向量;
    • 4)全部语句计算完成后,拼接语句类别代表的值,写入csv文件中。

    主要代码如下图所示:

    4_getwordvecs--获取词向量代码

    代码执行完成后,得到一个名为2000_data.csv的文件,第一列为类别对应的数值(1-pos, 0-neg),第二列开始为数值向量,每一行代表一条评论。结果的部分截图如下所示:

    词向量截图

    3.5 降维

    Word2vec模型设定了400的维度进行训练,得到的词向量为400维,本文采用PCA算法对结果进行降维。具体实现代码如下所示:

    5_pca_svm--PCA降维代码

    运行代码,根据结果图发现前100维就能够较好的包含原始数据的绝大部分内容,因此选定前100维作为模型的输入。

    PCA维度解释结果图

    4 分类模型构建

    本文采用支持向量机(SVM)作为本次实验的中文文本分类模型,其他分类模型采用相同的分析流程,在此不赘述。

    支持向量机(SVM)是一种有监督的机器学习模型。本文首先采用经典的机器学习算法SVM作为分类器算法,通过计算测试集的预测精度和ROC曲线来验证分类器的有效性,一般来说ROC曲线的面积(AUC)越大模型的表现越好。

    首先使用SVM作为分类器算法,随后利用matplotlib和metric库来构建ROC曲线。具体python代码如下所示:

    5_pca_svm--SVM代码

    运行代码,得到Test Accuracy: 0.88,即本次实验测试集的预测准确率为88%,ROC曲线如下图所示。

    ROC曲线图

    至此,利用Pyhon对酒店评论进行中文情感极性分析的流程与方法全部介绍完毕,代码和数据已上传至本人的GitHub仓库,data文件夹中包含停用词表stopWord.txt和测试集ChnSentiCorp_htl_ba_2000,还可采用其他分类模型进行分类,欢迎各位朋友批评指正、共同学习!

    相关文章

      网友评论

      • 牛奶不加糖_6aee:你好,博主能给我你的CNN算法代码吗?谢谢!719771993@qq.com
        非常感谢!!!
      • 牛奶不加糖_6aee:博主你好,我用anaconda中的Spyder运行1process出现这个错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xd0 in position 493: illegal multibyte sequence,请问是怎么回事呢
      • Nian_0248:楼主你好,我想问下我的结果准确率是百分之99可能是因为我的数据量太小了吗?如果我要用训练集进行测试是不是也是这个步骤呢?但是这样的话我也提前分好了语料的类别,还有什么进行分类的意义呢?谢谢您。
      • 694e47ba87cf:博主你好,如果要得到准确率,召回率,FI值,你代码该怎么写呢?

        from sklearn.metrics import classification_report,accuracy_score
        printf classification_report(data_test.target,y)。我按照这个直接是标签不对,可能是变量值不对,求楼主解答,qq2316321763
      • 温水酒馆:博主,最后训练分类模型时,你是怎么把数据分为训练集和测试集的呢?还是说,您的这个模型只是对训练集进行了分类,并没有测试集?
        atLee:@温水酒馆 这个实验并没有分训练集和测试集,是直接拿训练集训练模型,后又用训练集当做测试集来验证准确率的,你可以根据自己的需求进行划分。
      • cunteng008:你好,我是tensorflow初学者,请哪里用到了tensorflow库,怎么没见导入该库?
      • ca8512b5d25e:博主的电脑什么配置的,我运行到第四步出现memory error,我没用Windows系统没用gpu
        温水酒馆:博主,我在运行4_getwordvecs.py时总是报错:EOFError: unexpected end of input; is count incorrect or file otherwise damaged? 请问这种怎么处理呢?
        atLee:我之前在4GWin7的电脑中报内存的错误,更换成8G内存的Mac后就好了,你应该也是内存的问题。
        ca8512b5d25e:@我也不知谢谢!
      • wenzhuz:你好,博客和github里面有SVM算法实现,没有CNN实现的代码,请问能否分享我CNN的代码,非常感谢,287234548@qq.com
      • 雅望_d208:你好,github里面只有SVM算法实现,能给我你的CNN算法代码吗?谢谢!2862284818@qq.com
      • 帅帅蒋蒋:博主求一份全部源代码谢谢!464365377@qq.com
        atLee:@帅帅蒋蒋 代码和数据都在github中,文末已给出链接,请自行下载。
      • 丨尐惜缘:博主,你好,文章写的很好。我最近也在学习python和情感分析,初学者小白一个,特地过来膜拜学习,方便把每部分的完整代码发给我啃啃么,邮箱holysll@qq.com,还有这个链接http://www.datatang.com/data/11936 语料集相爱在不了,方便的话一起发给我,我跟着你的步骤做做实验测试,万分感谢
        atLee:@丨尐惜缘 报错的意思是编码有问题,你试试看把读取的txt文档(如2000_neg.txt)在NotePad++中转成UTF-8编码。
        丨尐惜缘:首先,非常感谢您的无私分享,我按照您给的步骤做,作为新手小白,2_cutsentence代码一直报错,修改不来,求大神指教
        File "C:/Users/holysll/PycharmProjects/untitled/sentiment analysis/Test3/2_cutsentence.py",line 58, in <module>
        prepareData(sourceFile,targetFile)
        File "C:/Users/holysll/PycharmProjects/untitled/sentiment analysis/Test3/2_cutsentence.py",line 17, in prepareData
        line = f.readline()
        File "C:\Users\holysll\Anaconda2\lib\codecs.py", line 690, in readline
        return self.reader.readline(size)
        File "C:\Users\holysll\Anaconda2\lib\codecs.py", line 545, in readline
        data = self.read(readsize, firstline=True)
        File "C:\Users\holysll\Anaconda2\lib\codecs.py", line 492, in read
        newchars, decodedbytes = self.decode(data, self.errors)
        UnicodeDecodeError: 'utf8' codec can't decode byte 0xb1 in position 0: invalid start byte
        atLee:已上传到github中,文末已给出地址,包括数据也已经上传,欢迎来讨论。
      • 98b07dd495a2:楼主,求完整代码,谢谢!
        843278553@qq.com :pray:
        atLee:已上传到github中,文末已给出地址,欢迎来讨论。
      • 51352a397a8b:楼主,你好!我学习到你的“3.4 获取特征词向量”时,代码不完整,可否提供完整的代码,邮箱jovenchu@163.com!万分感谢!
        atLee:已上传到github中,文末已给出地址,欢迎来讨论。
      • frogbar:博主,你好,你这篇博客的获取特征词向量代码4_getwordvec好像不完整,能不能提供一下完整的代码呢,我的邮箱1093758532@qq.com,谢谢了。
        atLee:已发邮箱。
      • 小爷_00a0:你好,矩阵计算均值,怎么计算?
        atLee:@cunteng008 之前是打算再用深度学习的算法执行一遍,要用到tensorflow库,后来实验没有用那个算法,你可以忽略掉:smile:
        cunteng008:小爷_00a0 请问你知道该项目哪里导入了tensorflow吗
        atLee:矩阵行相加的和除以行数

      本文标题:利用Python实现中文情感极性分析

      本文链接:https://www.haomeiwen.com/subject/spmsxxtx.html