情感词典_情感词典分享下载 - CSDN
精华内容
参与话题
  • 中文情感词典

    2020-07-17 17:50:52
    自然语言处理使用的情感词典,包括知网词典、台湾大学NTUSD、清华大学李军、Bosen情感词典、否定词词典等
  • 基于情感词典的情感分析

    万次阅读 多人点赞 2018-04-28 22:07:45
    思路以及代码都来源于下面两篇文章:一个不知死活的胖子:Python做文本情感分析之情感极性分析 Ran Fengzheng 的博客:基于情感词典的文本情感极性分析相关代码基于情感词典的情感分析应该是最简单的情感分析方法了...

    思路以及代码都来源于下面两篇文章:

    一个不知死活的胖子Python做文本情感分析之情感极性分析

     Ran Fengzheng 的博客基于情感词典的文本情感极性分析相关代码


    基于情感词典的情感分析应该是最简单的情感分析方法了,大致说一下使用情感词典进行情感分析的思路:

    对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和程度副词划分为一个组,如果有否定词将情感词的情感权值乘以-1,如果有程度副词就乘以程度副词的程度值,最后所有组的得分加起来,大于0的归于正向,小于0的归于负向。


    准备:

    1.BosonNLP情感词典

    既然是基于情感词典的分析,当然需要一份包含所有情感词的词典,网上已有现成的,直接下载即可。

    https://bosonnlp.com/dev/resource

    从下载的文件里,随便粘了几个正向的情感词,词后面的数字表示的是情感词的情感分值,一般正向的都是正数,负向的是负数:

    丰富多彩 1.87317228434
    神采飞扬 1.87321290817
    细微 1.87336937803
    178.00 1.87338705728
    不辞辛劳 1.87338705728
    保加利亚 1.87338705728

    注:由于BosonNLP是基于微博、新闻、论坛等数据来源构建的情感词典,因此拿来对其他类别的文本进行分析效果可能不好

    也有一种将所有情感词的情感分值设为1的方法来计算,想要详细了解可参考此文章:

    文本情感分类(一):传统模型

    2.否定词词典

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

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

    程度副词如:非常、很、特别...等词

    原博中提供了《知网》情感分析用词语集(beta版)的下载链接,该词典中包含了程度副词已经对应的程度值,但是下载下来之后发现只有程度副词,并没有对应的程度值。

    从程度级别词语.txt中选取了一部分程度副词,可以看到只有程度词,没有程度值,这个时候就自己看情况赋一个值好了:

    中文程度级别词语		219
    
    1. “极其|extreme / 最|most”	69
    百分之百
    倍加
    备至
    不得了
    不堪
    不可开交
    不亦乐乎
    不折不扣
    彻头彻尾
    充分
    到头
    地地道道
    非常
    极
    极度
    极端
    极其
    极为
    截然
    尽
    惊人地

    改完之后的格式如下,程度副词和程度值用逗号分割,程度值可以自己定义:

    百分之百,2
    倍加,2
    备至,2
    不得了,2
    不堪,2
    不可开交,2
    不亦乐乎,2
    不折不扣,2
    彻头彻尾,2
    .....

    4.停用词词典

    数据堂的下载本地总是打不开,因此原博中提供的数据堂的中文停用词下载也是没下载下来,然后使用了snownlp源码中的停用词词典,但是后来发现有些情感词被当做停用词了

    数据堂停用词下载:http://www.datatang.com/data/43894

    snownlp源码:https://github.com/isnowfy/snownlp (停用词在snownlp/normal文件夹下 stopwords.txt)

    5.分词工具

    由于使用python,选择了jieba分词

    数据和工具都准备好了,现在可以开始情感分析了~

    来一个简单的句子:我今天很高兴也非常开心

    (1)分词,去除停用词

    我、今天、也被当作停用词去掉,剩下很、高兴、非常、开心

    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('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))
    
    (2)将分词结果转为字典,key为单词,value为单词在分词结果中的索引,后来想到一个问题,如果把单词作为key的话假如一个情感词在文中出现了多次,那么应该是只记录了这个词最后一次出现的位置,其他的被覆盖掉了。

    将上一步得到的分词结果转为字典:

    {'很': 0, '高兴': 1, '非常': 2, '开心': 3}

    def list_to_dict(word_list):
        """将分词后的列表转为字典,key为单词,value为单词在列表中的索引,索引相当于词语在文档中出现的位置"""
        data = {}
        for x in range(0, len(word_list)):
            data[word_list[x]] = x
        return data

    (3)对分词结果分类,找出情感词、否定词和程度副词

    情感词sen_word(高兴和开心,key为单词的索引,value为情感权值):

     {1: '1.48950851679', 3: '2.61234173173'}


    程度副词degree_word(很和非常,key为索引,value为程度值)
    {0: '1.75', 2: '2'}

    否定词not_word,由于没有出现否定词,所以否定词为空:
    {}

    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()
    (4)计算得分

    首先设置初始权重W为1,从第一个情感词开始,用权重W*该情感词的情感值作为得分(用score记录),然后判断与下一个情感词之间是否有程度副词及否定词,如果有否定词将W*-1,如果有程度副词,W*程度副词的程度值,此时的W作为遍历下一个情感词的权重值,循环直到遍历完所有的情感词,每次遍历过程中的得分score加起来的总和就是这篇文档的情感得分。

    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

    W=1

    score=0

    第一个情感词是高兴,高兴的情感权值为1.48950851679,score=W*情感权值=1*1.48950851679=1.48950851679

    高兴和下一个情感词开心之间出现了程度副词非常,程度值为2,因此W=W*2=1*2=2,然后获取下一个情感词

    下一个情感词是开心,此时W=2,score=score+2*2.61234173173=1.48950851679+2*2.61234173173=6.71419198025

    遍历结束

    这里也发现两个问题:

    (1)第一个情感词之前出现的程度副词和否定词被忽略了

    (2)在判断两个情感词之间出现否定词以及程度副词时,W没有被初始化为1,这样W就被累乘了

            有兴趣的可以修改一下~

    完整代码:

    from collections import defaultdict
    import os
    import re
    import jieba
    import codecs
    
    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('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))
    
    
    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是情感词,索引01是情感分值
            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()
    
        # 分类
        for word in word_dict.keys():
            if word in sen_dict.keys() and word not in not_word_list and word not in degree_dic.keys():
                # 找出分词结果中在情感字典中的词
                sen_word[word_dict[word]] = sen_dict[word]
            elif word in not_word_list and word not in degree_dic.keys():
                # 分词结果中在否定词列表中的词
                not_word[word_dict[word]] = -1
            elif word in degree_dic.keys():
                # 分词结果中在程度副词中的词
                degree_word[word_dict[word]] = degree_dic[word]
        sen_file.close()
        degree_file.close()
        not_word_file.close()
        # 将分类结果返回
        return sen_word, not_word, degree_word
    
    
    def list_to_dict(word_list):
        """将分词后的列表转为字典,key为单词,value为单词在列表中的索引,索引相当于词语在文档中出现的位置"""
        data = {}
        for x in range(0, len(word_list)):
            data[word_list[x]] = x
        return data
    
    
    def get_init_weight(sen_word, not_word, degree_word):
        # 权重初始化为1
        W = 1
        # 将情感字典的key转为list
        sen_word_index_list = list(sen_word.keys())
        if len(sen_word_index_list) == 0:
            return W
        # 获取第一个情感词的下标,遍历从0到此位置之间的所有词,找出程度词和否定词
        for i in range(0, sen_word_index_list[0]):
            if i in not_word.keys():
                W *= -1
            elif i in degree_word.keys():
                # 更新权重,如果有程度副词,分值乘以程度副词的程度分值
                W *= float(degree_word[i])
        return W
    
    
    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
    
    # 计算得分
    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
    
    # 测试
    print(setiment_score("我今天很高兴也非常开心"))

    展开全文
  • (全)包括知网Hownet情感词典,台湾大学NTUSD简体中文情感词典,情感词汇本体,情感词典及其分类,清华大学李军中文褒贬义词典,汉语情感词极值表,否定词典,褒贬词及其近义词
  • 基于情感词典的文本情感分类

    千次阅读 2019-06-03 21:32:59
    基于情感词典的文本情感分类 传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如上图。我们首先通过学习来记忆一些基本词汇,如否定词语有“不”,积极词语有“喜欢”、“爱”,消极词语...

    基于情感词典的文本情感分类

    传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如上图。我们首先通过学习来记忆一些基本词汇,如否定词语有“不”,积极词语有“喜欢”、“爱”,消极词语有“讨厌”、“恨”等,从而在大脑中形成一个基本的语料库。然后,我们再对输入的句子进行最直接的拆分,看看我们所记忆的词汇表中是否存在相应的词语,然后根据这个词语的类别来判断情感,比如“我喜欢数学”,“喜欢”这个词在我们所记忆的积极词汇表中,所以我们判断它具有积极的情感。
    基于上述思路,我们可以通过以下几个步骤实现基于情感词典的文本情感分类:预处理、分词、训练情感词典、判断,整个过程可以如下图所示。而检验模型用到的原材料,包括薛云老师提供的蒙牛牛奶的评论,以及从网络购买的某款手机的评论数据(见附件)。

    文本的预处理
    由网络爬虫等工具爬取到的原始语料,通常都会带有我们不需要的信息,比如额外的Html标签,所以需要对语料进行预处理。由薛云老师提供的蒙牛牛奶评论也不例外。我们队伍使用Python作为我们的预处理工具,其中的用到的库有Numpy和Pandas,而主要的文本工具为正则表达式。经过预处理,原始语料规范为如下表,其中我们用-1标注消极情感评论,1标记积极情感评论。

    句子自动分词
    为了判断句子中是否存在情感词典中相应的词语,我们需要把句子准确切割为一个个词语,即句子的自动分词。我们对比了现有的分词工具,综合考虑了分词的准确性和在Python平台的易用性,最终选择了“结巴中文分词”作为我们的分词工具。
    下表仅展示各常见的分词工具对其中一个典型的测试句子的分词效果:
    测试句子:工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作

    载入情感词典
    一般来说,词典是文本挖掘最核心的部分,对于文本感情分类也不例外。情感词典分为四个部分:积极情感词典、消极情感词典、否定词典以及程度副词词典。为了得到更加完整的情感词典,我们从网络上收集了若干个情感词典,并且对它们进行了整合去重,同时对部分词语进行了调整,以达到尽可能高的准确率。

    我们队伍并非单纯对网络收集而来的词典进行整合,而且还有针对性和目的性地对词典进行了去杂、更新。特别地,我们加入了某些行业词汇,以增加分类中的命中率。不同行业某些词语的词频会有比较大的差别,而这些词有可能是情感分类的关键词之一。比如,薛云老师提供的评论数据是有关蒙牛牛奶的,也就是饮食行业的;而在饮食行业中,“吃”和“喝”这两个词出现的频率会相当高,而且通常是对饮食的正面评价,而“不吃”或者“不喝”通常意味着对饮食的否定评价,而在其他行业或领域中,这几个词语则没有明显情感倾向。另外一个例子是手机行业的,比如“这手机很耐摔啊,还防水”,“耐摔”、“防水”就是在手机这个领域有积极情绪的词。因此,有必要将这些因素考虑进模型之中。
    文本情感分类
    基于情感词典的文本情感分类规则比较机械化。简单起见,我们将每个积极情感词语赋予权重1,将每个消极情感词语赋予权重-1,并且假设情感值满足线性叠加原理;然后我们将句子进行分词,如果句子分词后的词语向量包含相应的词语,就加上向前的权值,其中,否定词和程度副词会有特殊的判别规则,否定词会导致权值反号,而程度副词则让权值加倍。最后,根据总权值的正负性来判断句子的情感。基本的算法如图。

    要说明的是,为了编程和测试的可行性,我们作了几个假设(简化)。假设一:我们假设了所有积极词语、消极词语的权重都是相等的,这只是在简单的判断情况下成立,更精准的分类显然不成立的,比如“恨”要比“讨厌”来得严重;修正这个缺陷的方法是给每个词语赋予不同的权值,我们将在本文的第二部分探讨权值的赋予思路。假设二:我们假设了权值是线性叠加的,这在多数情况下都会成立,而在本文的第二部分中,我们会探讨非线性的引入,以增强准确性。假设三:对于否定词和程度副词的处理,我们仅仅是作了简单的取反和加倍,而事实上,各个否定词和程度副词的权值也是不一样的,比如“非常喜欢”显然比“挺喜欢”程度深,但我们对此并没有区分。
    在算法的实现上,我们则选用了Python作为实现平台。可以看到,借助于Python丰富的扩展支持,我们仅用了一百行不到的代码,就实现了以上所有步骤,得到了一个有效的情感分类算法,这充分体现了Python的简洁。下面将检验我们算法的有效性。

    困难所在
    经过两次测试,可以初步认为我们的模型正确率基本达到了80%以上。另外,一些比较成熟的商业化程序,它的正确率也只有85%到90%左右(如BosonNLP)。这说明我们这个简单的模型确实已经达到了让人满意的效果,另一方面,该事实也表明,传统的“基于情感词典的文本情感分类”模型的性能可提升幅度相当有限。这是由于文本情感分类的本质复杂性所致的。经过初步的讨论,我们认为文本情感分类的困难在以下几个方面。
    语言系统是相当复杂的
    归根结底,这是因为我们大脑中的语言系统是相当复杂的。
    (1)我们现在做的是文本情感分类,文本和文本情感都是人类文化的产物,换言之,人是唯一准确的判别标准。
    (2)人的语言是一个相当复杂的文化产物,一个句子并不是词语的简单线性组合,它有相当复杂的非线性在里面。
    (3)我们在描述一个句子时,都是将句子作为一个整体而不是词语的集合看待的,词语的不同组合、不同顺序、不同数目都能够带来不同的含义和情感,这导致了文本情感分类工作的困难。
    因此,文本情感分类工作实际上是对人脑思维的模拟。我们前面的模型,实际上已经对此进行了最简单的模拟。然而,我们模拟的不过是一些简单的思维定式,真正的情感判断并不是一些简单的规则,而是一个复杂的网络。
    大脑不仅仅在情感分类
    事实上,我们在判断一个句子的情感时,我们不仅仅在想这个句子是什么情感,而且还会判断这个句子的类型(祈使句、疑问句还是陈述句?);当我们在考虑句子中的每个词语时,我们不仅仅关注其中的积极词语、消极词语、否定词或者程度副词,我们会关注每一个词语(主语、谓语、宾语等等),从而形成对整个句子整体的认识;我们甚至还会联系上下文对句子进行判断。这些判断我们可能是无意识的,但我们大脑确实做了这个事情,以形成对句子的完整认识,才能对句子的感情做了准确的判断。也就是说,我们的大脑实际上是一个非常高速而复杂的处理器,我们要做情感分类,却同时还做了很多事情。
    活水:学习预测
    人类区别于机器、甚至人类区别于其他动物的显著特征,是人类具有学习意识和学习能力。我们获得新知识的途径,除了其他人的传授外,还包括自己的学习、总结和猜测。对于文本情感分类也不例外,我们不仅仅可以记忆住大量的情感词语,同时我们还可以总结或推测出新的情感词语。比如,我们只知道“喜欢”和“爱”都具有积极情感倾向,那么我们会猜测“喜爱”也具有积极的情感色彩。这种学习能力是我们扩充我们的词语的重要方式,也是记忆模式的优化(即我们不需要专门往大脑的语料库中塞进“喜爱”这个词语,我们仅需要记得“喜欢”和“爱”,并赋予它们某种联系,以获得“喜爱”这个词语,这是一种优化的记忆模式)。
    优化思路
    经过上述分析,我们看到了文本情感分类的本质复杂性以及人脑进行分类的几个特征。而针对上述分析,我们提出如下几个改进措施。
    非线性特征的引入
    前面已经提及过,真实的人脑情感分类实际上是严重非线性的,基于简单线性组合的模型性能是有限的。所以为了提高模型的准确率,有必要在模型中引入非线性。
    所谓非线性,指的是词语之间的相互组合形成新的语义。事实上,我们的初步模型中已经简单地引入了非线性——在前面的模型中,我们将积极词语和消极词语相邻的情况,视为一个组合的消极语块,赋予它负的权值。更精细的组合权值可以通过“词典矩阵”来实现,即我们将已知的积极词语和消极词语都放到同一个集合来,然后逐一编号,通过如下的“词典矩阵”,来记录词组的权值。
    并不是每一个词语的组合都是成立的,但我们依然可以计算它们之间的组合权值,情感权值的计算可以阅读参考文献。然而,情感词语的数目相当大,而词典矩阵的元素个数则是其平方,其数据量是相当可观的,因此,这已经初步进入大数据的范畴。为了更加高效地实现非线性,我们需要探索组合词语的优化方案,包括构造方案和储存、索引方案。
    情感词典的自动扩充
    在如今的网络信息时代,新词的出现如雨后春笋,其中包括“新构造网络词语”以及“将已有词语赋予新的含义”;另一方面,我们整理的情感词典中,也不可能完全包含已有的情感词语。因此,自动扩充情感词典是保证情感分类模型时效性的必要条件。目前,通过网络爬虫等手段,我们可以从微博、社区中收集到大量的评论数据,为了从这大批量的数据中找到新的具有情感倾向的词语,我们的思路是无监督学习式的词频统计。
    我们的目标是“自动扩充”,因此我们要达到的目的是基于现有的初步模型来进行无监督学习,完成词典扩充,从而增强模型自身的性能,然后再以同样的方式进行迭代,这是一个正反馈的调节过程。虽然我们可以从网络中大量抓取评论数据,但是这些数据是无标注的,我们要通过已有的模型对评论数据进行情感分类,然后在同一类情感(积极或消极)的评论集合中统计各个词语的出现频率,最后将积极、消极评论集的各个词语的词频进行对比。某个词语在积极评论集中的词频相当高,在消极评论集中的词频相当低,那么我们就有把握将该词语添加到消极情感词典中,或者说,赋予该词语负的权值。
    举例来说,假设我们的消极情感词典中并没有“黑心”这个词语,但是“可恶”、“讨厌”、“反感”、“喜欢”等基本的情感词语在情感词典中已经存在,那么我们就会能够将下述句子正确地进行情感分类:

    本文结论
    综合上述研究,我们得出如下结论:
    基于情感词典的文本情感分类是容易实现的,其核心之处在于情感词典的训练。
    语言系统是相当复杂的,基于情感词典的文本情感分类只是一个线性的模型,其性能是有限的。
    在文本情感分类中适当地引入非线性特征,能够有效地提高模型的准确率。
    引入扩充词典的无监督学习机制,可以有效地发现新的情感词,保证模型的强健性和时效性。

    展开全文
  • 基于情感词典进行情感态度分析

    千次阅读 热门讨论 2020-02-22 11:51:06
    情感分析是指挖掘文本表达的观点,识别主体对某客体的评价是褒还是贬,褒贬...我所使用的方法是基于语义理解中的使用情感词典进行情感态度分析。 下面是我所使用的情感词典: 链接:HTTPS://pan.baidu.com/s/1xC...

    情感分析是指挖掘文本表达的观点,识别主体对某客体的评价是褒还是贬,褒贬根据进态度行倾向性研究。文本情感分析可以分为基于机器学习的情感分类方法和基于语义理解的情感分析。基于机器学习进行语义分析的话需要大量的训练集,同时需要人工对其进行分类标注。我所使用的方法是基于语义理解中的使用情感词典进行情感态度分析。

    下面是我所使用的情感词典:

    链接:HTTPS://pan.baidu.com/s/1xC9mcZcHZbVWwF3YO8yqOA 
    提取码:t0vv 

    情感词典有很多种,比如哈工大整理的,知网情感词典以及台湾大学NTUSD简体中文情感词典等,但并不是每个词典对于我们来说都是有用的,我们要根据自己的文本内容来选择合适的情感词典。

    进行情感分析,我们不能按照自己怎么想就去怎么进行分析,需要一定的支撑条件。我所用的算法是根据北京交通大学杨立月和王移芝两位所写的“微博情感分析的情感词典构造及分析方法研究”这篇论文所编写的,这论文的地址http://kns.cnki.net/kcms/detail/61.1450.tp.20181115.1046.008.html

    进行情感分析的大致流程如下图:

    第一步先对文本进行预处理:

        这里对文本进行预处理就是对句子进行分词,分词工具有很多,我选择的是使用python中的结巴分词,这个分词工具很好用,可以在分词的同时将词性也分析出来。不过在分词之前,对于一段文本内容来说,并不是所有的内容都对情感分析有帮助,比如一本书的书名,微博文本的标题以及一些非中文内容等,时候这个就我们可以用正则表达式只匹配我们需要的内容

    import jieba.posseg as pseg #包括了词性(词语,词性)
    
    def seg_word(sentenct):
        d = ""
        sentenct = re.sub(u"\\#.*?\\#|\\@.*?\\ |\\《.*?\\》|【.*?】", "", sentenct)  # 处理#...#和@... (空格)间的数据
        s = re.compile(r'http://[a-zA-Z0-9.?/&=:]*', re.S)
        sentenct = s.sub("", sentenct)
        segList = pseg.cut(sentenct)  #分词
        segResult = []
        data_c = []
        data_p =[]
        for word,flag in segList:
            if ('\u4e00' <= word <= '\u9fa5'):   #判断字符串是否为中文
                if len(word)>1:
                    data_p.append(word)
                segResult.append(word)
            s = word + "/" + flag
            d=d+s+"  "
        data_c.append(d)
        return data_c  #带有词性的列表
    

    第二步就是将分词后的词向量通过情感词典进行训练了:

        英汉词典情感包括情感词,否定词,副词程度以及停用词  

              情感词:是主体对某一客体表示内在评价的词语,带有强烈的感情色彩。

              程度副词:本身没有情感倾向,但能够增强或减弱情感强度  

              否定词:本身也没有情感倾向,但能改变情感的极性

              停用词:完全没有用或者没有意义的词

        首先我们可以利用停用词去掉一些没有意义的词语,比如这,那,是等词语,将一些没有意义的词语过滤掉后,剩下的大部分就是对情感分析有用的词语了。在去除了停用词后,我们就可以利用情感词,程度副词以及否定词来运用一定的算法进行情感分析了

    下面是通过停用词典匹配的代码

    def stopchineseword(segResult):
        file = open("f:\\chineseStopWords.txt","r")
        data = []
        new_segResult=[]
        for i in file.readlines(): #从文件中读取数据并将其添加到列表中
            data.append(i.strip())
        for i in segResult:
            if i in data:  #比较是否为停用词
                continue
            else:
                new_segResult.append(i)
        return new_segResult

    在做完上面两步后,我们就可以开始利用情感词典来进行分析了

         有人会问知道了情感词后如何进行分析呢,这只是词语啊?在这里,我们就需要给情感词进行打分了。情感词分为正面情感词和负面情感词,也可能会多分几类,但在这只讨论正反两面。有些情感词典可能会给出情感词对应的分值(怎么算的我就不知道了)。根据上面说的论文中所写,我们对情感词进行赋值,正面情感词分值为1,负面情感词分值为-1,中性词则为0程度副词也可以根据词典中所给出的不同程度基于不同等级的分值,否定词则全部置为 - 1。

         语义是语句进行情感分类的重要特征,文档分类判断应按照词汇,句子,微博短文的步骤进行判断。情感倾向情感词前经常有程度副词修饰。当情感词前有程度副词修饰时,则会使情感词的情感倾向加强或减弱。而情感词前有否定词修饰时会使情感词的情感倾向反转。但在这里需要注意一个问题,就是对于否定词和程度词的不同位置可能会有两种结果。一是“否定词+程度副词+情感词”,还有就是“程度副词+否定词+情感词”。

    对于“否定词+程度副词+情感词”的计算方式是

          w = t *( - 1)* a * 0.5

    对于“程度副词+否定词+情感词”的计算方式是

         w = t *( - 1)* a * 2

    其中w表示计算得到的情感词语的情感强度值,t表示情感词的权值,表示该情感词t前的程度副词的权值

    在求得词向量中所有情感词的权值后进行求和,若得到的分值大于0,则为正面情感;若分值小于0,则为负面情感;若分值为0,则为中性情感。

    大致算法的就跟下图所示一样,但我这张图还存在一些缺陷,就是在判断词语词性时没有将循环展示出来

    求情感词的代码如下(重点在于计算整句话中情感词的权值)

    def classify_words(dict_data):
        positive_words = []
        positive_word = open("f:\\正面情绪词.txt","r",encoding="utf-8").readlines()
        for i in positive_word:
            positive_words.append(i.strip())
    
        negative_words = []
        negative_word = open("f:\\负面情绪词.txt","r",encoding="utf-8").readlines()
        for i in negative_word:
            negative_words.append(i.strip())
    
        privative_words = []
        privative_word = open("f:\\否定词.txt","r",encoding="utf-8").readlines()
        for i in privative_word:
            privative_words.append(i.strip())
    
        adverb_of_degree_words1 = []
        adverb_of_degree1 = open("f:\\2倍.txt","r").readlines()
        for i in adverb_of_degree1:
            adverb_of_degree_words1.append(i.strip())
    
        adverb_of_degree_words2 = []
        adverb_of_degree2 = open("f:\\1.5倍.txt","r").readlines()
        for i in adverb_of_degree2:
            adverb_of_degree_words2.append(i.strip())
    
        adverb_of_degree_words3 = []
        adverb_of_degree3 = open("f:\\1.25倍.txt","r").readlines()
        for i in adverb_of_degree3:
            adverb_of_degree_words3.append(i.strip())
    
        adverb_of_degree_words4 = []
        adverb_of_degree4 = open("f:\\1.2倍.txt","r").readlines()
        for i in adverb_of_degree4:
            adverb_of_degree_words4.append(i.strip())
    
        adverb_of_degree_words5 = []
        adverb_of_degree5 = open("f:\\0.8倍.txt","r").readlines()
        for i in adverb_of_degree5:
            adverb_of_degree_words5.append(i.strip())
    
        adverb_of_degree_words6 = []
        adverb_of_degree6 = open("f:\\0.5倍.txt","r").readlines()
        for i in adverb_of_degree6:
            adverb_of_degree_words6.append(i.strip())
    
        z = 0
        data = []
        for k,v in enumerate(dict_data):
            w = 0
            if v in positive_words:   #为正面情感词
                w += 1
                for i in range(z, int(k)):
                    if dict_data[i] in privative_words:
                        for j in range(z, i):   #程度词+否定词+情感词
                            if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \
                                    dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \
                                    dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:
                                w = w * (-1) * 2
                                break
                        for j in range(i, int(k)):  #否定词+程度词+情感词
                            if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \
                                    dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \
                                    dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:
                                w = w * 0.5
                                break
                    elif dict_data[i] in adverb_of_degree_words1:
                        w =w * 2
                    elif dict_data[i] in adverb_of_degree_words2:
                        w =w * 1.5
                    elif dict_data[i] in adverb_of_degree_words3:
                        w =w * 1.25
                    elif dict_data[i] in adverb_of_degree_words4:
                        w =w * 1.2
                    elif dict_data[i] in adverb_of_degree_words5:
                        w =w * 0.8
                    elif dict_data[i] in adverb_of_degree_words6:
                        w =w * 0.5
                z = int(k) + 1
            if v in negative_words:   #为负面情感词
                w -= 1
                for i in range(z, int(k)):
                    if dict_data[i] in privative_words:
                        for j in range(z, i):    #程度词+否定词+情感词
                            if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \
                                    dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \
                                    dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:
                                w = w * (-1)*2
                                break
                        for j in range(i,int(k)):    #否定词+程度词+情感词
                             if dict_data[j] in adverb_of_degree_words6 or dict_data[j] in adverb_of_degree_words5 or \
                                     dict_data[j] in adverb_of_degree_words4 or dict_data[j] in adverb_of_degree_words3 or \
                                     dict_data[j] in adverb_of_degree_words2 or dict_data[j] in adverb_of_degree_words1:
                                 w = w*0.5
                                 break
                    if dict_data[i] in adverb_of_degree_words1:
                        w *= 2
                    elif dict_data[i] in adverb_of_degree_words2:
                        w *= 1.5
                    elif dict_data[i] in adverb_of_degree_words3:
                        w *= 1.25
                    elif dict_data[i] in adverb_of_degree_words4:
                        w *= 1.2
                    elif dict_data[i] in adverb_of_degree_words5:
                        w *= 0.8
                    elif dict_data[i] in adverb_of_degree_words6:
                        w *= 0.5
                z = int(k)+1
            data.append(w)
        return data
    

     

     

    展开全文
  • 中文情感词典合集

    2020-07-30 23:32:07
    中文情感词典合集TXT+XLS+DOC :知网Hownet情感词典+清华大学李军中文褒贬义词典...
  • 基于情感词典的情感打分

    千次阅读 2018-05-11 10:22:29
    原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动)。论文在这里下载:基于情感词典的中文微博情感倾向性研究 (大家可以上...

    原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动)。

    论文在这里下载:基于情感词典的中文微博情感倾向性研究 
    (大家可以上知网自行下载)

    本文采用的方法如下: 
    这里写图片描述 
    首先对单条微博进行文本预处理,并以标点符号为分割标志,将单条微博分割为n个句子,提取每个句子中的情感词 。以下两步的处理均以分句为处理单位。

    第二步在情感词表中寻找情感词,以每个情感词为基准,向前依次寻找程度副词、否定词,并作相应分值计算。随后对分句中每个情感词的得分作求和运算。

    第三步判断该句是否为感叹句,是否为反问句,以及是否存在表情符号。如果是,则分句在原有分值的基础上加上或减去对应的权值。

    最后对该条微博的所有分句的分值进行累加,获得该条微博的最终得分。

    代码如下:

    首先文件结构图如下: 
    这里写图片描述

    其中,degree_dict为程度词典,其中每个文件为不同的权值。 
    emotion_dict为情感词典,包括了积极情感词和消极情感词以及停用词。

    文件一:文本预处理 textprocess.py 
    在里面封装了一些文本预处理的函数,方便调用。

    # -*- coding: utf-8 -*-
    __author__ = 'Bai Chenjia'
    
    import jieba
    import jieba.posseg as pseg
    print "加载用户词典..."
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    jieba.load_userdict('C://Python27/Lib/site-packages/jieba/user_dict/pos_dict.txt')
    jieba.load_userdict('C://Python27/Lib/site-packages/jieba/user_dict/neg_dict.txt')
    
    # 分词,返回List
    def segmentation(sentence):
        seg_list = jieba.cut(sentence)
        seg_result = []
        for w in seg_list:
            seg_result.append(w)
        #print seg_result[:]
        return seg_result
    
    # 分词,词性标注,词和词性构成一个元组
    def postagger(sentence):
        pos_data = pseg.cut(sentence)
        pos_list = []
        for w in pos_data:
            pos_list.append((w.word, w.flag))
        #print pos_list[:]
        return pos_list
    
    # 句子切分
    def cut_sentence(words):
        words = words.decode('utf8')
        start = 0
        i = 0
        token = 'meaningless'
        sents = []
        punt_list = ',.!?;~,。!?;~… '.decode('utf8')
        #print "punc_list", punt_list
        for word in words:
            #print "word", word
            if word not in punt_list:   # 如果不是标点符号
                #print "word1", word
                i += 1
                token = list(words[start:i+2]).pop()
                #print "token:", token
            elif word in punt_list and token in punt_list:  # 处理省略号
                #print "word2", word
                i += 1
                token = list(words[start:i+2]).pop()
                #print "token:", token
            else:
                #print "word3", word
                sents.append(words[start:i+1])   # 断句
                start = i + 1
                i += 1
        if start < len(words):   # 处理最后的部分
            sents.append(words[start:])
        return sents
    
    def read_lines(filename):
        fp = open(filename, 'r')
        lines = []
        for line in fp.readlines():
            line = line.strip()
            line = line.decode("utf-8")
            lines.append(line)
        fp.close()
        return lines
    
    # 去除停用词
    def del_stopwords(seg_sent):
        stopwords = read_lines("f://Sentiment_dict/emotion_dict/stop_words.txt")  # 读取停用词表
        new_sent = []   # 去除停用词后的句子
        for word in seg_sent:
            if word in stopwords:
                continue
            else:
                new_sent.append(word)
        return new_sent
    
    # 获取六种权值的词,根据要求返回list,这个函数是为了配合Django的views下的函数使用
    def read_quanzhi(request):
        result_dict = []
        if request == "one":
            result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/most.txt")
        elif request == "two":
            result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/very.txt")
        elif request == "three":
            result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/more.txt")
        elif request == "four":
            result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/ish.txt")
        elif request == "five":
            result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/insufficiently.txt")
        elif request == "six":
            result_dict = read_lines("f://emotion/mysite/Sentiment_dict/degree_dict/inverse.txt")
        else:
            pass
        return result_dict
    
    
    
    if __name__ == '__main__':
        test_sentence1 = "这款手机大小合适。"
        test_sentence2 = "这款手机大小合适,配置也还可以,很好用,只是屏幕有点小。。。总之,戴妃+是一款值得购买的智能手机。"
        test_sentence3 = "这手机的画面挺好,操作也比较流畅。不过拍照真的太烂了!系统也不好。"
        """
        seg_result = segmentation(test_sentence3)  # 分词,输入一个句子,返回一个list
        for w in seg_result:
            print w,
        print '\n'
        """
        """
        new_seg_result = del_stopwords(seg_result)  # 去除停用词
        for w in new_seg_result:
            print w,
        """
        #postagger(test_sentence1)  # 分词,词性标注,词和词性构成一个元组
        #cut_sentence(test_sentence2)    # 句子切分
        #lines = read_lines("f://Sentiment_dict/emotion_dict/posdict.txt")
        #print lines[:]

    文件二:情感打分 dict_main.py 
    其中待处理数据放在chinese_weibo.txt中,读者可以自行更改文件目录,该文件中的数据格式如下图: 
    这里写图片描述

    即用每一行代表一条语句,我们对每条语句进行情感分析,进行打分

    # -*- coding: utf-8 -*-
    __author__ = 'Bai Chenjia'
    
    import text_process as tp
    import numpy as np
    
    # 1.读取情感词典和待处理文件
    # 情感词典
    print "reading..."
    posdict = tp.read_lines("f://emotion/mysite/Sentiment_dict/emotion_dict/pos_all_dict.txt")
    negdict = tp.read_lines("f://emotion/mysite/Sentiment_dict/emotion_dict/neg_all_dict.txt")
    # 程度副词词典
    mostdict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/most.txt')   # 权值为2
    verydict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/very.txt')   # 权值为1.5
    moredict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/more.txt')   # 权值为1.25
    ishdict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/ish.txt')   # 权值为0.5
    insufficientdict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/insufficiently.txt')  # 权值为0.25
    inversedict = tp.read_lines('f://emotion/mysite/Sentiment_dict/degree_dict/inverse.txt')  # 权值为-1
    
    # 情感级别
    emotion_level1 = "悲伤。在这个级别的人过的是八辈子都懊丧和消沉的生活。这种生活充满了对过去的懊悔、自责和悲恸。在悲伤中的人,看这个世界都是灰黑色的。"
    emotion_level2 = "愤怒。如果有人能跳出冷漠和内疚的怪圈,并摆脱恐惧的控制,他就开始有欲望了,而欲望则带来挫折感,接着引发愤怒。愤怒常常表现为怨恨和复仇心里,它是易变且危险的。愤怒来自未能满足的欲望,来自比之更低的能量级。挫败感来自于放大了欲望的重要性。愤怒很容易就导致憎恨,这会逐渐侵蚀一个人的心灵。"
    emotion_level3 = "淡定。到达这个能级的能量都变得很活跃了。淡定的能级则是灵活和无分别性的看待现实中的问题。到来这个能级,意味着对结果的超然,一个人不会再经验挫败和恐惧。这是一个有安全感的能级。到来这个能级的人们,都是很容易与之相处的,而且让人感到温馨可靠,这样的人总是镇定从容。他们不会去强迫别人做什么。"
    emotion_level4 = "平和。他感觉到所有的一切都生机勃勃并光芒四射,虽然在其他人眼里这个世界还是老样子,但是在这人眼里世界却是一个。所以头脑保持长久的沉默,不再分析判断。观察者和被观察者成为同一个人,观照者消融在观照中,成为观照本身。"
    emotion_level5 = "喜悦。当爱变得越来越无限的时候,它开始发展成为内在的喜悦。这是在每一个当下,从内在而非外在升起的喜悦。这个能级的人的特点是,他们具有巨大的耐性,以及对一再显现的困境具有持久的乐观态度,以及慈悲。同时发生着。在他们开来是稀松平常的作为,却会被平常人当成是奇迹来看待。"
    # 情感波动级别
    emotion_level6 = "情感波动很小,个人情感是不易改变的、经得起考验的。能够理性的看待周围的人和事。"
    emotion_level7 = "情感波动较大,周围的喜悦或者悲伤都能轻易的感染他,他对周围的事物有敏感的认知。"
    
    
    # 2.程度副词处理,根据程度副词的种类不同乘以不同的权值
    def match(word, sentiment_value):
        if word in mostdict:
            sentiment_value *= 2.0
        elif word in verydict:
            sentiment_value *= 1.75
        elif word in moredict:
            sentiment_value *= 1.5
        elif word in ishdict:
            sentiment_value *= 1.2
        elif word in insufficientdict:
            sentiment_value *= 0.5
        elif word in inversedict:
            #print "inversedict", word
            sentiment_value *= -1
        return sentiment_value
    
    
    # 3.情感得分的最后处理,防止出现负数
    # Example: [5, -2] →  [7, 0]; [-4, 8] →  [0, 12]
    def transform_to_positive_num(poscount, negcount):
        pos_count = 0
        neg_count = 0
        if poscount < 0 and negcount >= 0:
            neg_count += negcount - poscount
            pos_count = 0
        elif negcount < 0 and poscount >= 0:
            pos_count = poscount - negcount
            neg_count = 0
        elif poscount < 0 and negcount < 0:
            neg_count = -poscount
            pos_count = -negcount
        else:
            pos_count = poscount
            neg_count = negcount
        return (pos_count, neg_count)
    
    
    # 求单条微博语句的情感倾向总得分
    def single_review_sentiment_score(weibo_sent):
        single_review_senti_score = []
        cuted_review = tp.cut_sentence(weibo_sent)  # 句子切分,单独对每个句子进行分析
    
        for sent in cuted_review:
            seg_sent = tp.segmentation(sent)   # 分词
            seg_sent = tp.del_stopwords(seg_sent)[:]
            #for w in seg_sent:
            #   print w,
            i = 0    # 记录扫描到的词的位置
            s = 0    # 记录情感词的位置
            poscount = 0    # 记录该分句中的积极情感得分
            negcount = 0    # 记录该分句中的消极情感得分
    
            for word in seg_sent:   # 逐词分析
                #print word
                if word in posdict:  # 如果是积极情感词
                    #print "posword:", word
                    poscount += 1   # 积极得分+1
                    for w in seg_sent[s:i]:
                        poscount = match(w, poscount)
                    #print "poscount:", poscount
                    s = i + 1  # 记录情感词的位置变化
    
                elif word in negdict:  # 如果是消极情感词
                    #print "negword:", word
                    negcount += 1
                    for w in seg_sent[s:i]:
                        negcount = match(w, negcount)
                    #print "negcount:", negcount
                    s = i + 1
    
                # 如果是感叹号,表示已经到本句句尾
                elif word == "!".decode("utf-8") or word == "!".decode('utf-8'):
                    for w2 in seg_sent[::-1]:  # 倒序扫描感叹号前的情感词,发现后权值+2,然后退出循环
                        if w2 in posdict:
                            poscount += 2
                            break
                        elif w2 in negdict:
                            negcount += 2
                            break
                i += 1
            #print "poscount,negcount", poscount, negcount
            single_review_senti_score.append(transform_to_positive_num(poscount, negcount))   # 对得分做最后处理
        pos_result, neg_result = 0, 0   # 分别记录积极情感总得分和消极情感总得分
        for res1, res2 in single_review_senti_score:  # 每个分句循环累加
            pos_result += res1
            neg_result += res2
        #print pos_result, neg_result
        result = pos_result - neg_result   # 该条微博情感的最终得分
        result = round(result, 1)
        return result
    
    """
    # 测试
    weibo_sent = "这手机的画面挺好,操作也比较流畅。不过拍照真的太烂了!系统也不好。"
    score = single_review_sentiment_score(weibo_sent)
    print score
    """
    
    # 分析test_data.txt 中的所有微博,返回一个列表,列表中元素为(分值,微博)元组
    def run_score():
        fp_test = open('f://emotion/mysite/Weibo_crawler/chinese_weibo.txt', 'r')   # 待处理数据
        contents = []
        for content in fp_test.readlines():
            content = content.strip()
            content = content.decode("utf-8")
            contents.append(content)
        fp_test.close()
        results = []
        for content in contents:
            score = single_review_sentiment_score(content)  # 对每条微博调用函数求得打分
            results.append((score, content))   # 形成(分数,微博)元组
        return results
    
    # 将(分值,句子)元组按行写入结果文件test_result.txt中
    def write_results(results):
        fp_result = open('test_result.txt', 'w')
        for result in results:
            fp_result.write(str(result[0]))
            fp_result.write(' ')
            fp_result.write(result[1])
            fp_result.write('\n')
        fp_result.close()
    
    # 求取测试文件中的正负极性的微博比,正负极性分值的平均值比,正负分数分别的方差
    def handel_result(results):
        # 正极性微博数量,负极性微博数量,中性微博数量,正负极性比值
        pos_number, neg_number, mid_number, number_ratio = 0, 0, 0, 0
        # 正极性平均得分,负极性平均得分, 比值
        pos_mean, neg_mean, mean_ratio = 0, 0, 0
        # 正极性得分方差,负极性得分方差
        pos_variance, neg_variance, var_ratio = 0, 0, 0
        pos_list, neg_list, middle_list, total_list = [], [], [], []
        for result in results:
            total_list.append(result[0])
            if result[0] > 0:
                pos_list.append(result[0])   # 正极性分值列表
            elif result[0] < 0:
                neg_list.append(result[0])   # 负极性分值列表
            else:
                middle_list.append(result[0])
        #################################各种极性微博数量统计
        pos_number = len(pos_list)
        neg_number = len(neg_list)
        mid_number = len(middle_list)
        total_number = pos_number + neg_number + mid_number
        number_ratio = pos_number/neg_number
        pos_number_ratio = round(float(pos_number)/float(total_number), 2)
        neg_number_ratio = round(float(neg_number)/float(total_number), 2)
        mid_number_ratio = round(float(mid_number)/float(total_number), 2)
        text_pos_number = "积极微博条数为 " + str(pos_number) + " 条,占全部微博比例的 %" + str(pos_number_ratio*100)
        text_neg_number = "消极微博条数为 " + str(neg_number) + " 条,占全部微博比例的 %" + str(neg_number_ratio*100)
        text_mid_number = "中性情感微博条数为 " + str(mid_number) + " 条,占全部微博比例的 %" + str(mid_number_ratio*100)
        ##################################正负极性平均得分统计
        pos_array = np.array(pos_list)
        neg_array = np.array(neg_list)    # 使用numpy导入,便于计算
        total_array = np.array(total_list)
        pos_mean = pos_array.mean()
        neg_mean = neg_array.mean()
        total_mean = total_array.mean()   # 求单个列表的平均值
        mean_ratio = pos_mean/neg_mean
        if pos_mean <= 6:                 # 赋予不同的情感等级
            text_pos_mean = emotion_level4
        else:
            text_pos_mean = emotion_level5
        if neg_mean >= -6:
            text_neg_mean = emotion_level2
        else:
            text_neg_mean = emotion_level1
        if total_mean <= 6 and total_mean >= -6:
            text_total_mean = emotion_level3
        elif total_mean > 6:
            text_total_mean = emotion_level4
        else:
            text_total_mean = emotion_level2
        ##################################正负进行方差计算
        pos_variance = pos_array.var(axis=
    展开全文
  • 情感分析资源 (转) 中文的... 情感词典 1.知网的情感词典 ...由知网发布的词典,包括中文情感词典和英文情感词典 (以下需要论坛积分) 2.台湾大学的情感极性词典 -http:/...
  • 目前最全的中文情感词典,包括以下内容: 1. 褒贬词及其近义词; 2. 汉语情感词极值表; 3. 清华大学李军中文褒贬义词典; 4. 情感词典及其分类; 5. 情感词汇本体; 6. 台湾大学NTUSD简体中文情感词典; 7. 知网How...
  • 最全中文情感词库

    2020-07-30 23:32:03
    目前最全的中文情感词典,包括以下内容: 褒贬词及其近义词 ,汉语情感词极值表, 清华大学李军中文褒贬义词典, 情感词典及其分类, 情感词汇本体, 台湾大学NTUSD简体中文情感词典, 知网Hownet情感词典
  • 情感词典构建

    万次阅读 2017-03-02 20:58:15
    看到一篇文章写的很清楚简洁,直接转了。 ------------------------------------------------------------...某主席说,“没有情感词典的“使用该情感词典进行情感分析”都是耍流氓。” 某帝说,“要有情感词典。”
  • 中文情感词典的构建

    千次阅读 2019-02-28 19:02:01
    首先,国外英文的情感分析已经取得了很好的效果,得益...我们首先将情感词典分为通用情感词典与专用情感词典。 1.通用情感词典的构建 通用情感词典的构建主要是通过将目前开源的情感词典整合起来,筛去重复和无...
  • 情感分析资源大全(语料、词典、词嵌入、代码)

    万次阅读 多人点赞 2018-07-01 16:56:34
    该博客收集情感分析领域中一些语料、词典等。 1 语料库 1.1 谭松波-酒店评论语料-UTF-8,10000条  现在网上大部分谭松波老师的评论语料资源的编码方式都是gb2312,本资源除了原始编码格式,还具有UTF-8编码...
  • 中文情感极性词典 NTUSD

    千次阅读 2018-04-11 17:49:33
    中文情感极性词典 NTUSD数据介绍项目背景情感分析是近年来在计算机领域内比较火热的一个研究方向,目前公认的情感分析比较系统的研究工作开始于基于监督学习方法对电影评论文本进行情感倾向性分类和基于无监督学习...
  • 短文本情感分析

    万次阅读 2017-01-03 18:13:08
    一、什么是情感分析:情感分析(SA)又称为倾向性分析和意见挖掘,它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程,其中情感分析还可以细分为情感极性(倾向)分析,情感程度分析,主客观分析等。...
  • 目前情感分析在中文自然语言处理中...在《基于情感词典的中文自然语言处理情感分析(上)》的基础上,本场 Chat 你将学到: 股吧数据情感分类; 情感可视化之绘制情感树; 通过自定义情感词权重计算情感值; 实战...
  • 笔者寄语:词典型情感分析对词典要求极高,词典中的词语需要人工去选择,但是这样的选择会很有目标以及针对性。本文代码大多来源于《数据挖掘之道》的情感分析章节。本书中还提到了监督算法式的情感分析,可见博客:...
  • 基于情感词典的文本情感分析

    千次阅读 热门讨论 2019-05-09 21:31:09
    原代码来源:... 本文是对原代码的几个bug进行了修复,用到的词典可由以上链接下载 import codecs from collections import defaultdict import jieba import xlrd # 分词,去除停用词 def seg_wo...
  • 文本分类应用: 常见的有垃圾邮件识别,情感分析 文本分类方向: 主要有二分类,多分类,多标签分类 文本分类方法: 传统机器学习方法(贝叶斯,svm等),深度学习方法(fastText,TextCNN等) 文本分类的处理大致...
  • # -*- coding:utf-8 -* ...#本脚本主要实现了基于python通过已有的情感词典对文本数据做的情感分析的项目目的 #导入对应的包及相关的自定义的jieba词典 import jieba import numpy as np jieba.load_us...
1 2 3 4 5 ... 20
收藏数 4,592
精华内容 1,836
关键字:

情感词典