精华内容
下载资源
问答
  • NLP情感分析之情感分类

    万次阅读 2018-09-26 15:38:35
    情感分析与情感分类 情感分析(sentiment analysis)是近年来国内外研究的热点,其任务是帮助用户快速获取、整理和分析相关评价信息,对带有情感色彩的主观性文本进行分析、处理、归纳和推理。 情感分析包含较多的...

    情感分析与情感分类

    情感分析(sentiment analysis)是近年来国内外研究的热点,其任务是帮助用户快速获取、整理和分析相关评价信息,对带有情感色彩的主观性文本进行分析、处理、归纳和推理。

    情感分析包含较多的任务,如情感分类(sentiment classification)、观点抽取(opinion extraction)、观点问答观点摘要等。因此很难简单地将其划归为某一个领域,往往从不同的角度将其划归到不同的方向。如果单纯地判别文本的倾向性,可以将其看作是一个分类任务;如果要从观点句中抽取相关的要素(观点持有者、观点评价对象等),则是一个信息抽取任务;而如果要从海量文本中找到对某一事物的观点,则可以看作是一个检索任务。

    随着互联网技术的迅速发展和普及,对网络内容管理、监控和有害(或垃圾)信息过滤的需求越来越大,网络信息的主观倾向性分类受到越来越多的关注。这种分类与传统的文本分类不同,传统的文本分类所关注的是文本的客观内容(objective),而倾向性分类所研究的对象是文本的“主观因素”,即作者所表达出来的主观倾向性,分类的结果是对于一个特定的文本要得到它是否支持某种观点的信息。这种独特的文本分类任务又称为情感分类

    情感分类

    情感分类是指根据文本所表达的含义和情感信息将文本划分成褒扬的或贬义的两种或几种类型,是对文本作者倾向性和观点、态度的划分,因此有时也称倾向性分析(opinion analysis)。

    情感分类作为一种特殊的分类问题,既有一般模式分类的共性问题,也有其特殊性,如情感信息表达的隐蔽性、多义性和极性不明显等。

    针对这些问题人们做了大量研究,提出了很多分类方法。这些方法可以按机器学习方法归类,也可以按情感文本的特点划分。

    1.按机器学习方法分类

    根据机器学习方法所使用训练样本的标注情况,情感文本分类可以大致分为有监督学习方法、半监督学习方法和无监督学习方法三类。

    有监督学习方法:基于有监督学习的情感分类方法使用机器学习方法用于训练大量标注样本。
    2002首次将有监督的学习方法应用到情感分类中,文献中分别比较了多种分类算法以及各种特征和特征权值选择策略在基于监督学习的情感分类中的效果。2004将主观句摘要引入情感分类中;2010分析了极性转移对情感分类的影响;2011使用基于特征空间及分类算法的集成学习方法有效地提高了情感分类的性能。

    半监督学习方法:基于半监督学习的情感分类方法是通过在少量标注样本上训练,并在大量未标注样本上进行学习的方式构建分类模型。
    2009将多种机器学习方法(例如:聚类方法、集成学习等)融入基于半监督学习的情感分类中;面对情感分类中汉语标注语料匮乏的问题,2009采用协同学习方法使用标注的英文语料和无标注的中文语料实现了高性能的中文情感分类。2010将情感文本的表达分为个人的和非个人的两种视图,应用协同学习进行情感分类的半监督学习。

    无监督学习方法:基于无监督学习的情感分类方法是指仅使用非标注样本进行情感分类建模。
    以往的大部分研究工作都是通过情感分类标注的种子词集来实现无监督分类,2002通过计算文本中候选单词与种子情感词之间的点互信息来计算文本的情感倾向性,选择“excellent”和“poor”作为种子词,在得到每个单词与种子词之间的点互信息后,根据SO-PMI计算每个词的情感倾向性,并通过词语计数的方式计算文本的整体情感倾向性。2006通过基于HowNet的语义分析抽取单词的情感信息。2009根据样本空间中文档与单词的共现关系,基于潜在狄利克雷分布(latent Dirichlet allocation,LDA)的浅层语义分析方法获取未标注样本的标签。

    2.按研究问题分类

    根据情感文本分类中侧重关注的问题,可以将情感分类研究划分为领域相关性研究和数据不平衡问题研究两类。

    领域相关性研究:情感分类是一个领域相关(domain-specific)的问题,当训练集和测试集属于不同的领域时,基于监督学习的情感分类方法通常会表现出较差的效果。因此,领域适应性(domain adaptation)研究成为一个重要课题,其目的就是尽量使情感分类器在跨领域学习时保持一定的分类性能。

    2005针对领域适应中的特征选择、分类器融合和训练集的组合等问题做了详细分析。2007提出了一种基于结构共现学习(structural correspondence learning,SCL)的情感分类领域适应方法,在跨领域情感分类中取得了较好的性能。2010利用基于图模型的Graph-Ranking算法处理中文情感分类中的领域适应问题。2011将集成学习方法应用于“多领域”情感分类,让多个领域的资源互相帮助,从而使整体的情感分类性能获得提升。

    数据不平衡问题研究:情感分类往往牵涉样本的正负类别分布不平衡的问题。

    Li et al.(2011b)对实际情况中的样本不平衡问题做了深入分析。假设在情感分类中有N个样本的训练数据,其中包含N+个正类样本和N-个负类样本。目前大多数研究总是假设正类样本数和负类样本数是平衡的,即N+=N-,但实际情况并非如此,更一般的情况是训练数据中一类样本要远远多于另一类样本。

    针对不平衡数据的有监督情感分类问题,Li et al.(2011c)提出了一种基于中心向量的不平衡情感分类方法。
    该方法包括以下几个步骤对不平衡数据的标注样本进行训练:
    ①将“多类”里面的所有训练样本进行聚类;
    ②在各个聚类里面进行内部层次采样,获得同“少类”相同规模的样本;
    ③使用这些采样样本并结合整个类的中心向量构建的新向量进行训练学习。该方法借鉴中心向量充分利用“多类”里面所有样本的分类信息,获得了比其他传统采样方法或者代价敏感方法更优的分类性能。

    针对不平衡数据的半监督情感分类问题,Li et al.(2011b)提出了一种基于协同学习的半监督学习方法。
    该方法有如下两个特点:
    ①使用欠采样技术对训练样本进行平衡采样,用于构建多个欠采样分类器,利用多个分类器对非标注样本进行标注;
    ②采用动态特征子空间的方式,即每次迭代重新生产特征子空间,增加多分类器之间的差异性,进一步提升协同学习的性能。
    实验结果表明,该方法在处理情感分类的数据不平衡问题上,能够利用非标注样本提高分类性能。另外,该工作的一个贡献是首次提出了一种针对不平衡数据分类的半监督学习方法。

    针对不平衡数据的情感分类中的主动学习问题,Li et al.(2012b)提出了一种集成确定性和不确定性样本选择策略的方法,用于主动选择不平衡数据中信息量大的样本以提高分类性能。其中,确定性和不确定性分布由两个分开的特征子空间进行控制,不确定性用于选择信息量大的样本,确定性用于选择尽量平衡的数据。此外,对于确定性判断出来的“多类”非标注样本进行自动标注,进一步降低样本的标注规模。实验证明,在同样的标注情况下该方法能够大幅度提高不平衡数据的分类性能。

     

    展开全文
  • 主要参考文献CSDN:基于机器学习的NLP情感分析(一)---- 数据采集与词向量构造方法(京东商品评论情感分析)0 情感分析(Sentiment Analysis)情感分析(Sentiment analysis),又称倾向性分析,意见抽取(Opinion ...

    主要参考文献

    CSDN:基于机器学习的NLP情感分析(一)---- 数据采集与词向量构造方法(京东商品评论情感分析)

    0 情感分析(Sentiment Analysis)

    情感分析(Sentiment analysis),又称倾向性分析,意见抽取(Opinion extraction),意见挖掘(Opinion mining),情感挖掘(Sentiment mining),主观分析(Subjectivity analysis),它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。

    通常情感分析任务包括如下几类(我爱公开课:斯坦福大学自然语言处理第七课“情感分析(Sentiment Analysis)”):

    1. 简单分类Simplest task: Is the attitude of this text positive or negative?
    2. 复杂分类More complex: Rank the attitude of this text from 1 to 5
    3. 高级Advanced: Detect the target, source, or complex attitude types

    主流思想:

    基于情感词典:是指根据已构建的情感词典,对待分析文本进行文本处理抽取情感词,计算该文本的情感倾向,即根据语义和依存关系来量化文本的情感色彩。最终分类效果取决于情感词库的完善性,另外需要很好的语言学基础,也就是说需要知道一个句子通常在什么情况为表现为Positive和Negative。

    基于机器学习:是指选取情感词作为特征词,将文本矩阵化,利用logistic Regression, 朴素贝叶斯(Naive Bayes),支持向量机(SVM)等方法进行分类。最终分类效果取决于训练文本的选择以及正确的情感标注。

    例子:知乎:NLP情感分析|流程概述(一)

    现状:主流的是第一种方法,原因是不是所有的文本都是标注好的,机器学习的方法大多数情况都是需要对数据进行人工标注的,人工标注非常耗时耗力。另外对于特定领域,判断情感需要很多的专业知识,例如要判断一条金融新闻是利好还是利空。

    1 数据采集

    使用python3.5比较好,因为3.5对中文更友好;需要额外下载request库。

    1.1 python3.5+anaconda+TensorFlow 安装

    anaconda和TensorFlow快速安装参考下列步骤:

    • 安装之前需要注意:Windows只有python3.5才能调用tensorflow,所以要下载对应python3.5版本的anaconda3-4.2.0

    在官网下载时,注意不要盲目选择版本,留意下图中的3.5版本

    anaconda官网:https://www.anaconda.com/download/

    下载目录:https://repo.continuum.io/archive/.winzip/ 

    (参考CSDN:Tensorflow学习笔记(一)Win7+python3.5+Tensorflow+pycharm

    • python3.5版本的anaconda4.2.0安装选择正确的安装包(如图)下载安装即可。
    (参考CSDN:win7安装Anaconda+TensorFlow+配置PyCharm 安装python3.5版本的anaconda4.2.0)
    • TensorFlow安装:安装前先为tensorflow新建一个干净的环境:conda create -n tensorflow python=3.5 然后pip install tensorflow等待安装成功即可。
    (参考CSDN:Tensorflow学习笔记(一)Win7+python3.5+Tensorflow+pycharm 或者CSDN:【深度学习】windows下安装TensorFlow )
    • 配置pycharm:在【file】->【project:...】->【project interpreter】中配置即可。

    (参考CSDN:win7安装Anaconda+TensorFlow+配置PyCharm )


    另外,anaconda和TensorFlow详细安装解释见:TensorFlow在windows上安装与简单示例 ,生动细致,常见雷区,以及小例子。

    1.2 爬取数据

    爬虫入门:使用python抓取并分析京东商品评论数据

    京东爬虫,可抓取京东商品信息和评论

    分布式爬虫:从京东"窃取"150+万条数据

    2 分词

    中文分词可利用jieba, THULAC,ICTCLAS

    jieba:易用,可以添加自定义词库或者删除“无效词”(stopwords)。自定义词库按需求添加,可以不适用;但是“无效词”表达情感时没有明确的情感指向但却很常用(词频很高),因此这些词的TF-IDF仍然可能非常高,所以需要主动删除,以避免引入噪声。

    3 向量词构造

    TF-IDFbigram等。

    TF-IDF用于计算词库中最具代表性的词 。

    TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。博客园:TF-IDF及其算法

    4 分类

    4.1 特征相关性

    PMI CSDN:点互信息(PMI,Pointwise Mutual Information)

    4.2 模型选择


    展开全文
  • python nlp情感分析之极性分析

    千次阅读 2019-12-30 21:36:02
    最近与某高校新闻媒体学院合作进行大数据情感分析,学院老师要求采用情感字典进行情感极性分析,之前做项目情感分析都是采用深度模型做的,这次打算使用情感字典进行情感极性分析,并且以后可以用来收集数据。...

    背景

    目前做情感分析基本使用机器学习或者深度学习进行情感分析,准确率已经很高了。最近与某高校新闻媒体学院合作进行大数据情感分析,学院老师要求采用情感字典进行情感极性分析,之前做项目情感分析都是采用深度模型做的,这次打算使用情感字典进行情感极性分析,并且以后可以用来收集数据。

    1.数据准备

    1.1 情感词典准备

    话说是基于情感词典的极性分析,当然要有情感字典,可以采用下面的链接直接下载。

    https://bosonnlp.com/resources/BosonNLP_sentiment_score.zip

    解压缩之后可以看到BosonNLP_sentiment_score.txt文件,里面的数据如下:

    如虎添翼 6.37503943135
    定购 6.37503943135
    富婆团 6.37503943135
    赖世荣 6.37503943135

    这里挑选了几个正面的词语,分为两列,第一列为情感词,第二列情感词的情感值,越大代表越正面。

    1.2 否定词

    文本情感分类(一):传统模型中提供了一个情感极性词典的下载包,包中带了一个否定词的txt。

    https://kexue.fm/usr/uploads/2017/09/1922797046.zip

    不大
    不丁点儿
    不甚
    不怎么
    聊
    没怎么
    不可以
    怎么不
    几乎不
    从来不
    从不
    不用
    不曾
    不该
    不必
    不会
    不好
    不能
    很少
    极少
    没有
    不是
    难以
    放下
    扼杀
    终止
    停止
    放弃
    反对
    缺乏
    缺少
    不
    甭
    勿
    别
    未
    反
    没
    否
    木有
    非
    无
    请勿
    无须
    并非
    毫无
    决不
    休想
    永不
    不要
    未尝
    未曾
    毋
    莫
    从未
    从未有过
    尚未
    一无
    并未
    尚无
    从没
    绝非
    远非
    切莫
    绝不
    毫不
    禁止
    忌
    拒绝
    杜绝
    弗
    

    1.3 程度副词词典

    程度副词可以使用从这里《知网》情感分析用词语集(beta版)下载,里面包含程度级别的词语,但是里面的格式是汇总的形式,需要转换为词典的形式,这里做了一个简单的程度副词标记,大于1,表示情感加强,小于1,表示情感弱化,下面主要按照极其1.8,超1.6,很1.5,较1,稍0.7,欠0.5进行了一个简单的标记,如下所示。也可以根据自己的需求及及进行修改。

    百分之百,1.8
    倍加,1.8
    备至,1.8
    不得了,1.8
    不堪,1.8
    不可开交,1.8
    不亦乐乎,1.8
    不折不扣,1.8
    彻头彻尾,1.8
    充分,1.8
    到头,1.8
    地地道道,1.8
    非常,1.8
    极,1.8
    极度,1.8
    极端,1.8
    极其,1.8
    极为,1.8
    截然,1.8
    尽,1.8
    惊人地,1.8
    绝,1.8
    绝顶,1.8
    绝对,1.8
    绝对化,1.8
    刻骨,1.8
    酷,1.8
    满,1.8
    满贯,1.8
    满心,1.8
    莫大,1.8
    奇,1.8
    入骨,1.8
    甚为,1.8
    十二分,1.8
    十分,1.8
    十足,1.8
    死,1.8
    滔天,1.8
    痛,1.8
    透,1.8
    完全,1.8
    完完全全,1.8
    万,1.8
    万般,1.8
    万分,1.8
    万万,1.8
    无比,1.8
    无度,1.8
    无可估量,1.8
    无以复加,1.8
    无以伦比,1.8
    要命,1.8
    要死,1.8
    已极,1.8
    已甚,1.8
    异常,1.8
    逾常,1.8
    贼,1.8
    之极,1.8
    之至,1.8
    至极,1.8
    卓绝,1.8
    最为,1.8
    佼佼,1.8
    郅,1.8
    綦,1.8
    齁,1.8
    最,1.8
    不过,1.5
    不少,1.5
    不胜,1.5
    惨,1.5
    沉,1.5
    沉沉,1.5
    出奇,1.5
    大为,1.5
    多,1.5
    多多,1.5
    多加,1.5
    多么,1.5
    分外,1.5
    格外,1.5
    够瞧的,1.5
    够戗,1.5
    好,1.5
    好不,1.5
    何等,1.5
    很,1.5
    很是,1.5
    坏,1.5
    可,1.5
    老,1.5
    老大,1.5
    良,1.5
    颇,1.5
    颇为,1.5
    甚,1.5
    实在,1.5
    太,1.5
    太甚,1.5
    特,1.5
    特别,1.5
    尤,1.5
    尤其,1.5
    尤为,1.5
    尤以,1.5
    远,1.5
    着实,1.5
    曷,1.5
    碜,1.5
    大不了,0.8
    多,0.8
    更,0.8
    更加,0.8
    更进一步,0.8
    更为,0.8
    还,0.8
    还要,0.8
    较,0.8
    较比,0.8
    较为,0.8
    进一步,0.8
    那般,0.8
    那么,0.8
    那样,0.8
    强,0.8
    如斯,0.8
    益,0.8
    益发,0.8
    尤甚,0.8
    逾,0.8
    愈,0.8
    愈 ... 愈,0.8
    愈发,0.8
    愈加,0.8
    愈来愈,0.8
    愈益,0.8
    远远,0.8
    越 ... 越,0.8
    越发,0.8
    越加,0.8
    越来越,0.8
    越是,0.8
    这般,0.8
    这样,0.8
    足,0.8
    足足,0.8
    点点滴滴,0.7
    多多少少,0.7
    怪,0.7
    好生,0.7
    还,0.7
    或多或少,0.7
    略,0.7
    略加,0.7
    略略,0.7
    略微,0.7
    略为,0.7
    蛮,0.7
    稍,0.7
    稍稍,0.7
    稍微,0.7
    稍为,0.7
    稍许,0.7
    挺,0.7
    未免,0.7
    相当,0.7
    些,0.7
    些微,0.7
    些小,0.7
    一点,0.7
    一点儿,0.7
    一些,0.7
    有点,0.7
    有点儿,0.7
    有些,0.7
    半点,0.5
    不大,0.5
    不丁点儿,0.5
    不甚,0.5
    不怎么,0.5
    聊,0.5
    没怎么,0.5
    轻度,0.5
    弱,0.5
    丝毫,0.5
    微,0.5
    相对,0.5
    不为过,1.6
    超,1.6
    超额,1.6
    超外差,1.6
    超微结构,1.6
    超物质,1.6
    出头,1.6
    多,1.6
    浮,1.6
    过,1.6
    过度,1.6
    过分,1.6
    过火,1.6
    过劲,1.6
    过了头,1.6
    过猛,1.6
    过热,1.6
    过甚,1.6
    过头,1.6
    过于,1.6
    过逾,1.6
    何止,1.6
    何啻,1.6
    开外,1.6
    苦,1.6
    老,1.6
    偏,1.6
    强,1.6
    溢,1.6
    忒,1.6

    1.4 停止词

    停用词词典有很多,可以使用科院计算所中文自然语言处理开放平台发布了有1208个停用词的中文停用词表,也可以使用其他的停用词词表,但是要注意一下需要将否定词或者是程度副词的词典过滤掉,不然否定词在去除停用词的时候都过滤掉了,就缺少了一些程度副词或者否定词。如果需要过滤的话可以使用下面的方面过滤。

    #生成stopword生成,需要去除一些否定词和程度词
    stopwords = set()
    fr = codecs.open('data/中文停用词表.txt', 'r', 'utf-8')
    for word in fr:
        stopwords.add(word.strip())
    #否定词文件    
    not_word_file = open('data/notDict.txt', 'r+', encoding='utf-8')
        # 由于否定词只有词,没有分值,使用list即可
    not_word_list = not_word_file.readlines()
    not_word_list = [w.strip() for w in not_word_list]
    #程度副词文件
    degree_file = open('data/degree.txt', 'r+', encoding='utf-8')
    degree_list = degree_file.readlines()
    degree_list = [d.split(",")[0] for d in degree_list]
    #生成新的停止词
    with open("data/stopwords.txt", "w") as f:
        for s in stopwords:
            if (s not in not_word_list) and (s not in degree_list):
                f.write(s+"\n")

    2.数据预处理

    2.1 jieba分词

    直接使用jieba分词工具进行分词

    2.2 去除停用词

    在jieba分词之后过滤掉停用词

    def seg_word(sentence):
        """使用jieba对文档分词"""
        seg_list = jieba.cut(sentence)
        seg_result = []
        for w in seg_list:
            seg_result.append(w)
        # 读取停用词文件
        stopwords = set()
        fr = codecs.open('data/stopwords.txt', 'r', 'utf-8')
        for word in fr:
            stopwords.add(word.strip())
        fr.close()
        # 去除停用词
        return list(filter(lambda x: x not in stopwords, seg_result))
    

    3 模型构建

    3.1 找出文本中的情感词,否定词和程度副词

    def classify_words(word_dict):
        """词语分类,找出情感词、否定词、程度副词"""
        # 读取情感字典文件
        sen_file = open('BosonNLP_sentiment_score.txt', 'r+', encoding='utf-8')
        # 获取字典文件内容
        sen_list = sen_file.readlines()
        # 创建情感字典
        sen_dict = defaultdict()
        # 读取字典文件每一行内容,将其转换为字典对象,key为情感词,value为对应的分值
        for s in sen_list:
            # 每一行内容根据空格分割,索引0是情感词,索引1是情感分值(情感词典文件中有一行是空行,因此执行的时候会报错,注意处理一下空行,这里没有处理)
            sen_dict[s.split(' ')[0]] = s.split(' ')[1]
     
        # 读取否定词文件
        not_word_file = open('notDic.txt', 'r+', encoding='utf-8')
        # 由于否定词只有词,没有分值,使用list即可
        not_word_list = not_word_file.readlines()
     
        # 读取程度副词文件
        degree_file = open('degree.txt', 'r+', encoding='utf-8')
        degree_list = degree_file.readlines()
        degree_dic = defaultdict()
        # 程度副词与情感词处理方式一样,转为程度副词字典对象,key为程度副词,value为对应的程度值
        for d in degree_list:
            degree_dic[d.split(',')[0]] = d.split(',')[1]
     
        # 分类结果,词语的index作为key,词语的分值作为value,否定词分值设为-1
        sen_word = dict()
        not_word = dict()
        degree_word = dict()

    3.2 计算分数

    规则:分数采用情感词的分数和计算

    遍历所有的情感词,查看当前情感词的前面是否有否定词和程度副词,如果没有否定词,就对当前情感词乘以1,如果有否定词或者有多个否定词,可以乘以(-1)^否定词的个数;如果有程度副词,就在当前情感词前面乘以程度副词的程度等级。

    伪代码如下:

    finalSentiScore = (-1) ^ (num of notWords) * degreeNum * sentiScore
    finalScore = sum(finalSentiScore)
    def socre_sentiment(sen_word, not_word, degree_word, seg_result):
        """计算得分"""
        # 权重初始化为1
        W = 1
        score = 0
        # 情感词下标初始化
        sentiment_index = -1
        # 情感词的位置下标集合
        sentiment_index_list = list(sen_word.keys())
        # 遍历分词结果(遍历分词结果是为了定位两个情感词之间的程度副词和否定词)
        for i in range(0, len(seg_result)):
            # 如果是情感词(根据下标是否在情感词分类结果中判断)
            if i in sen_word.keys():
                # 权重*情感词得分
                score += W * float(sen_word[i])
                # 情感词下标加1,获取下一个情感词的位置
                sentiment_index += 1
                if sentiment_index < len(sentiment_index_list) - 1:
                    # 判断当前的情感词与下一个情感词之间是否有程度副词或否定词
                    for j in range(sentiment_index_list[sentiment_index], sentiment_index_list[sentiment_index + 1]):
                        # 更新权重,如果有否定词,取反
                        if j in not_word.keys():
                            W *= -1
                        elif j in degree_word.keys():
                            # 更新权重,如果有程度副词,分值乘以程度副词的程度分值
                            W *= float(degree_word[j])
            # 定位到下一个情感词
            if sentiment_index < len(sentiment_index_list) - 1:
                i = sentiment_index_list[sentiment_index + 1]
        return score

    3.3 计算每句话的分数

    def setiment_score(sententce):
        # 1.对文档分词
        seg_list = seg_word(sententce)
        # 2.将分词结果列表转为dic,然后找出情感词、否定词、程度副词
        sen_word, not_word, degree_word = classify_words(list_to_dict(seg_list))
        # 3.计算得分
        score = socre_sentiment(sen_word, not_word, degree_word, seg_list)
        return score
    

    3.4 计算整个新闻的情感值

    这里对整个文本根据标点符号进行分割,然后求整个文本的平均值。

    def sem_analyses(content):
    
        pattern = r',|\.|/|;|\'|`|\[|\]|<|>|\?|:|"|\{|\}|\~|!|@|#|\$|%|\^|&|\(|\)|-|=|\_|\+|,|。|、|;|‘|’|【|】|·|!| |…|(|)'
        test_text = 'b,b.b/b;b\'b`b[b]b<b>b?b:b"b{b}b~b!b@b#b$b%b^b&b(b)b-b=b_b+b,b。b、b;b‘b’b【b】b·b!b b…b(b)b'
        result_list = re.split(pattern, content)
        scores = 0
        for text in result_list:
            score = setiment_score(text)
            scores += score
        print(scores/len(result_list))
        return scores/len(result_list)
    #     print(result_list)
    content = "所长世界观政教分离才是伊拉克人民的美好未来方向,伊拉克没有共产党,不会有春天。伊拉克需要一个社会主义特色系统,宗教归宗教,宗教在心中,但人总不能用宗教治国吧。宗教是人的信仰,但治国是人类的发展方向,定好治国标准和信仰干涉治国的范围后,我相信伊拉克会有不一样未来,会非常美好。总之而言,伊拉克必须依法治国为主,依教为辅。"
    
    sem_analyses(content)

    以上就是根据情感词对文本数据进行极性分析。

     

    Reference:

    https://blog.csdn.net/cjjwwss/article/details/79953397

    https://blog.csdn.net/lom9357bye/article/details/79058946

    展开全文
  • 是一个6分类情感分析的数据集 包含: {"angry": 0, "happy": 1, "neural": 2, "surprise": 3, "sad": 4, "fear": 5} 大约3万多条数据
  • 基于机器学习的NLP情感分析(一)—- 数据采集与词向量构造方法 最近实习期间在做一个对新闻文本情感分析的项目。在此,用京东的商品评论练手,从数据采集到模型实现完整地写一遍,以备未来回顾所需。事实上,我...

    基于机器学习的NLP情感分析(一)—- 数据采集与词向量构造方法

    最近实习期间在做一个对新闻文本情感分析的项目。在此,用京东的商品评论练手,从数据采集到模型实现完整地写一遍,以备未来回顾所需。事实上,我采用的方法并不困难,甚至有点naive,所以权且作为练手吧。

    数据采集

    在这里为了避免人工标注的麻烦,使用的是京东iPad的用户评论。事实上,NLP情感分析中最花时间的就是人工标注。

    仔细查看调试台可以很容易地发现商品的评论信息都是用json来传递的。如下:

    https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv37157&productId=4675696&score=5&sortType=6&page=0&pageSize=10&isShadowSku=0&fold=1

    这个URL其实还是比较容易看出设计者的思路的。productId是商品对应的ID,score为用户对商品的评分,pageSize应该是一个请求发回的评论数。在实践中发现这种pageSize一般是不可以无限大的,也就是你别想着把pageSize写得很大,然后就可以一个请求返回一大堆数据。我的做法就是把pageSize写得一般大(^-^),然后不断地递增page来不断地爬去数据。

    score的规则如下:
    * 1:差评
    * 2:中评
    * 3:好评
    * 5:追评

    把这个URL放在浏览器的搜索地址里就可以得到返回的相应JSON数据了。这里就不展示了,自己去看吧。一开始你可能会觉得这个json,但只要仔细看看就知道你想要的数据在哪了。你要知道写网站的程序员也是程序员而已,程序员都喜欢工整的东西,因为“简单源于工整”,所以你只要发现他实现工整的方法,你就可以很简单地获取相应的数据了。

    事实上,京东对于网络爬虫是非常宽容的,就算不加任何的速度控制也可以毫无阻碍地完成数据的采集工作。这里建议使用Python3.5,因为3.5对中文的支持比较好,另外需要额外下载Request库。这就不再赘述了。

    构造词向量的方法

    TF-IDF

    这里我采用的是,利用TF-IDF来计算词库中最具代表性的词。

    概念

    TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。

    原理

    在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母 区别于IDF),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)

    逆向文件频率 (inverse document frequency, IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。

    某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语

    TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率(另一说:TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数)。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。(另一说:IDF反文档频率(Inverse Document Frequency)是指果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。)但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.

    在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语 来说,它的重要性可表示为:

    Stary 2017-07-18 at 4.13.35 P

    Stary 2017-07-18 at 4.13.28 P

    某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

    补充说明

    这里提出的TF-IDF的详细介绍只是给出了一种实现TF-IDF的一般做法,但是需要注意到的是,一般实现方法下的TF-IDF确实能够选出最能够区分不同文档的字词。但我希望做到的是,选出最能用于区分不同情感的字词,因此,这里我对公式做出了一点简单的修改。

    在计算tf的时候,我认为,整个语料库里只有两种文档,一种是好评文档,一种是差评文档,不去细分每一条评论。具体见实现。

    PMI 点相互信息

    PMI(Pointwise Mutual Information)这个指标来衡量两个事物之间的相关性(比如两个词)。

    在概率论中,我们知道,如果x跟y不相关,则p(x,y)=p(x)p(y)。二者相关性越大,则p(x,y)就相比于p(x)p(y)越大。用后面的式子可能更好理解,在y出现的情况下x出现的条件概率p(x|y)除以x本身出现的概率p(x),自然就表示x跟y的相关程度。
    这里的log来自于信息论的理论,可以简单理解为,当对p(x)取log之后就将一个概率转换为了信息量(要再乘以-1将其变为正数),以2为底时可以简单理解为用多少个bits可以表示这个变量。

    补充说明

    与前面的TF-IDF一样,我希望选出的是对分类情感最有效的词,所以在这里对公式做出一点简单的修改。

    PMI(word,pos)=logP(word,pos)P(pos)P(word)

    pos表示的文档的情感,word表示某一个词。

    分母表示同时在表现为pos情感和出现word词的概率。

    完整代码

    在实现中,我们需要解决的就是分词和计算词频的问题了。

    对于NLP来说,第一个问题就是要实现分词。市面上有很多的分词库,而且效果都还不错。比较难过的是,NLTK没有支持中文的分词方法,这里我使用的是jieba分词。jieba分词比较易用,而且可以很容易地添加自定义词库。在这个项目中,没有必须要加入自定义词库的需求,原因对于商品评论来说,没有非常特别的固定使用词。但是在我实习的项目,因为有很多固定用法的词,就非常有需要加自定义词库。

    另外需要注意的是,虽然不用加入自定义词库,但还是需要删除一些“无效词”(stopwords),这里无效指的是对表达情感时,没有明确的情感指向但却是非常常用的词,也就是这些词的词频会非常高,因此这些词的TF-IDF仍然可能非常高,所以需要主动删除,以避免引入噪声。

    Github

    实验结果

    构造向量的时候,不可能直接把所有的词都用上,只能选择其中的一部分。这里我选择的是PMI最大的前30个词。

    好评文档

    不错
    速度
    正品
    挺
    喜欢
    很快
    屏幕
    质量
    没
    没有
    满意
    流畅
    值得
    性价比
    高
    第一次
    好用
    快递
    送货
    运行
    好评
    评价
    系统
    清晰
    发货
    全新
    信赖
    好好
    送
    特别

    差评文档

    降价
    没有
    客服
    没
    差评
    屏幕
    送
    激活
    太
    退
    刚买
    退货
    差
    垃圾
    赠品
    想
    申请
    问
    发现
    降
    货
    完
    不好
    失望
    快递
    坑
    找
    第一次
    保护
    差价

    总结

    这里选出的有一些词,可能很难想象为什么他们可以很好地表现文档情感。有一些词可能是常用词,需要在把他们放入到常用词的文档中,在分词中就提前剔除。有一些则确实表现出人们的情感,但不一定是普遍意义上的情感词,而这就是为什么我会希望使用这个方法来构造情感分析的词向量。基于语义规则的情感分析只能把握一些人们都熟知的情感词,同时研究人员也需要非常多的时间去阅读文本来找到文本中一些能够体现情感的特别的词,例如在这个例子中,差价价格保护等词常常会出现在差评中,这反映了人们对商品服务的认识。当然这里其实也可以认为是提取热词,只不过是反映情感的热词

    这里,我采集的数据为好评和差评各一千条,所以总共是两千条评论。事实上,如果你愿意,也可以采集更多的评论来训练分类器。京东其实是非常“乐意”被爬虫的。
    另外,根据VC Theory,参数的维度越大所需要的训练数据集就要越大,一般来说,十倍参数的维度是训练集的下限,所以我使用了好评词汇和差评词汇中TF-IDF最大的前75个,构成150维的feature,以及1500条评论为训练集。当然在具体实践中,需要重新修改这个feature数目。

    至此,数据采集和构造词向量的部分就结束了。NLP情感分析中一般有两种方法,第一种是根据语义和依存关系来量化文本的情感色彩。但这种方法首先需要很完善的情感词库,另外需要很好的语言学基础,也就是说需要知道一个句子通常在什么情况为表现为Positive和Negative。我个人是觉得,我们永远无法穷经所有的语法规则和感情词汇,这也就无形之中增加了构造分类规则的难度。另外是,我个人是非常信奉大数据的。也就是说,我认为大数据是可以揭示一些超越人认知能力的信息,而这些信息是很难被人所察觉的。这就是机器学习或者说人工智能,会被如此的崇尚。第二种方法,就是基于机器学习的方法。基于机器学习,本质上就是要转化为机器学习能解决的问题。情感分析实际上就是认为是机器学习中的二分类问题。但是机器是无法理解文本的,所以我们必须能够实现让文本转化为向量,从而让机器能够理解。但其实,对于情感分析来说,最主流的还是第一种方法,原因就在于,并不是所有的文本都是已经标注好的。也就是说,我们很难想爬去京东的数据一样,一抓下来就知道这条文本是positive还是Negative。大多数情况都是需要对数据进行人工标注的。这个工作非常耗费人力。我自己亲身试验过人工标注,一天就只能标注大概400条的数据,并且已经非常累了。而且对于特定领域来说,判断情感还并不是一般人能做的,这其中需要很多的专业知识,例如要判断一条金融新闻是利好还是利空,事实上并没有这么容易。

    那么,其实这个feature selection的问题还没有这么简单。我这里只使用了单个词的TF-IDF,显然这是非常粗糙的选参方法。当然也可以尝试加上bigram之类的。那都是后话了。

    大概就是这么多了。下一部分,我将会尝试着对此处建立的”word2vec”的方法,相应地构造机器学习模型,并对模型进行相应的优化。

    引用

    TF-IDF及其算法
    PMI算法

    下集

    基于机器学习的NLP情感分析(二)—- 分类问题

    展开全文
  • VADER是一种基于词典和规则的情感分析工具,专门针对社交媒体中表达的情感进行调整。 工作很好! 示例代码: require_once "vadersentiment.php"; $textToTest = "La jolie Galline est belle, belle, BELLE !"; ...
  • NLP情感分析——KNN算法

    万次阅读 2018-05-07 17:13:02
    一、 基本概念文本情感分析是对文本中的某段已知文字的两极性进行分类,判断出此文字中表述的观点是积极的、消极的、还是中性的情绪。目前的研究方法主要有两类:一种是基于情感词典的方法,另一种是基于机器学习的...
  • 2020美赛C题我使用的情感分析方法 目前,一种快速的文本情感分析程序支持英语和中文。 实现原理如下: 加载情感词典(分为正词/负词/度词/负词)和切分。 正负词的情感价值是通过关键词匹配来积累的。正负词的默认...
  • 基于机器学习的NLP情感分析(二)—- 分类问题 前文提到了如何把一个文本转换为相应的词向量,本文讨论的是如何进行分类。 feature相关性首先,需要看看我之前选出来的feature,是否能够满足需求。这里其实有很多...
  • 情感分类又称情感倾向性分析,是指对给定的文本,识别其中主观性文本的倾向是肯定还是否定的,或者说是正面还是负面的,是情感分析领域研究最多的。 分析目的:对优酷电视剧《回答明朝当王爷之杨凌传》的评论进行...
  • 二、情感分析的背景  百科或新闻一类的文本具有事实性;评论或社交网站的文本具有用户性 情感分析的应用场景  消费决策:通过在购物网站上的评论确定商品的好评度  舆情分析:社交网站上通过对某一...
  • NLP作为AI当前最热门的子领域,目前重点是在使计算机能够理解和处理人类语言。百度、阿里、腾讯等大厂对于这方面相关专业人才需求很高。随着近年来UCG内容的增加,NLP在很大程度上需要解决...
  • https://zh.d2l.ai/chapter_natural-language-processing/sentiment-analysis-rnn.html
  • 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评...
  • 此前,百度大脑正式推出“EasyDL 深度学习实战营”系列课程,旨在帮助更多开发者快速 Get AI 模型训练与应用的...本次课程将分别讲解“解密 EasyDL 专业版的技术原理”和“NLP 情感分类技术解析与模型开发实战”。
  • 情感分析是自然语言处理中常见的场景,比如淘宝商品评价,饿了么外卖评价等,对于指导产品更新迭代具有关键性作用。通过情感分析,可以挖掘产品在各个维度的优劣,从而明确如何改进产品。比如对外卖评...
  • 目前,情感分析在中文自然语言处理(Natural Language Processing)中比较火热,很多场景下,我们都需要用到情感分析。比如,做金融产品量化交易,需要根据爬取的舆论数据...
  • 1 赛题描述 ...本练习赛所用数据,是名为「Roman Urdu DataSet」的公开数据集。 这些数据,均为文本数据。原始数据的文本,对应三类情感标签:Positive, Negative, Netural。 本练习赛,移除了标签为Netu...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,463
精华内容 585
关键字:

nlp情感分析