精华内容
下载资源
问答
  • 情感词典的正面情绪词、负面情绪词、否定词和程度副词
  • 情感分析 情感词典 语义词典 机器学习 情感
  • 找了一上午的情感词典,这些开源的词典在CSDN上全部需要高额的积分才能下载,十分耽误学习的时间。 因此将我搜集到的情感词典全部免费分享出来,主要包括台湾大学NTUSD简体中文情感词典+知网Hownet情感词典+清华大学...
  • NLP基于情感词典的情感分析情感分析主要是判别文本的情感倾向,即属于正面、负面、中性。利用机器提取人们对某人或事物的态度,从而发现潜在的问题用于改进或预测。目前主要的情感分析方法是基于情感词典的,以及...

    NLP

    基于情感词典的情感分析

    情感分析主要是判别文本的情感倾向,即属于正面、负面、中性。利用机器提取人们对某人或事物的态度,从而发现潜在的问题用于改进或预测。

    目前主要的情感分析方法是基于情感词典的,以及基于监督或半监督学习的。基于情感词典的方法都好说,本篇接下来会详细讲;基于监督或半监督学习的方法主要是基于神经网络、深度学习的一些方法将文档转换成向量后,利用SVM、贝叶斯分类器等分类器再去分类,从而判断文档的情感倾向。

    情感词典

    基于情感词典的情感分析主要是利用事先准备好的情感词库,给每个词以相应的情感倾向度的权值,然后从文本中提取出所有的情感词并根据句子特点(反问句,疑问句等)计算最后的情感得分和,根据情感得分判断文本的情感极性。

    这种方法的首要任务是如何去构建情感词典,如何判断一个词语是褒义词或贬义词,目前的研究有两种思路:一种是基于语义计算,一般可根据《知网》情感词计算语义相似度,计算目标词语跟基准词之间的紧密程度,得以判定情感极性;

    另一种是基于统计分析,计算目标词语基准词之间的点互信息值,确定两个词之间的紧密程度,从而获取目标词的情感倾向。

    基于语义计算

    基于语义计算的情感词构建,核心是如何构建基础情感词,然后由目标词与这些基础情感词做语义相似度计算。

    这类基础情感词必须要人工标记,我们一般选下列几种前人整理好的情感词典:《知网(HowNet)》

    它是一个以汉语和英语的词语所代表的概念为描述对象,以揭示概念与概念之间以及概念所具有的属性之间的关系为基本内容的常识知识库。

    知网发布了“情感分析用词语集(beta版)”,其中中文情感分析用词语集常用的有 4 个文件,分别为“正面情感词语”、“负面情感词语”、“正面评价词语”、“负面评价词语”。

    台湾大学 NTUSD

    NTUSD 的英文全称是 National Taiwan University Sentiment Dictionary,它是由台 湾大学整理并发布的情感词典,分为繁体中文和简体中文两个版本。两个版本都包 括有 2810 个正面情感词语和 8276 负面情感词语。

    其它情感词典

    其它情感词典包括张伟、刘缙等编著的《学生褒贬义词典》、史继林、朱英贵 编著《褒义词词典》以及杨玲、朱英贵编著的《贬义词词典》。对于微博评论等网络风格比较浓烈的文本情感分析来说,还有一些新生词,比如“稀饭(喜欢)”、“JJWW(唧唧歪歪)”等,就需要人工整理后加入到对应的情感词典表中了。

    我们在构建自己的情感词典时,可以综合这几种不同的情感词典,但考虑到受主观判断的影响,可能存在同一情感词在不同情感词典中的情感极性不同,我们可以对情感极性采用如下所示的规则进行投票决定:

    其中, 为投票结果; 为情感词在不同情感词典中的极性( 表示正向, 表示负向)。

    当情感词同时出现在三部源词典中,有两个词典极性相同,则取两个词典的极性;当情感词只出现在其中两部源词 典中,可能出现结果为 others,此时根据权威性,设定 优先权 其它词典 来选择极性。 保留原始极性的目的在于对比生成情感词典与源词 典的情感词极性。

    构建好上述的基础情感词典后,我们可以对语料库进行中文分词处理,然后扫描每个单词,与情感词典中的词进行 HowNet 语义相似度计算,当相似度达到一定阈值时即可判断该词的情感倾向和权值。

    其中 HowNet 语义相似度的计算部分我们在前面的相似度计算一篇中有详细介绍,读者可以参考阅读。

    基于统计分析

    基于统计分析的情感词典构造也是需要事先准备一套情感极性明显的基础情感词典,然后由目标词与该基础情感词典中的单词计算点间互信息,一般我们使用 SO-PMI算法,然后由点间互信息值来判断该目标词的情感极性和情感倾向度。

    基础情感词典的构造与上小节类似,我们下面直接讲 SO-PMI算法。

    互信息是非常重要的信息度量,在实际应用中应用最广泛的通常是点间互信息(PMI),主要用于计算词语间的语义相似度,基本思想是统计两个词语在文本同时出现的概率,如果概率越大,其相关性就越紧密,关联度越高。

    两个词语 和 的 值计算公式如下:

    其中 表示两个词语 与 共同出现的概率, 与 分别表示两个词语单独出现的概率。

    若两个词在数据集的某个小范围内共现概率越大,表明其关联度越大;反之,越小。 与 的比值是 与 两个词语的统计独立性度量。通过对其取对数,将其值转换为 3 种状态:

    两个词语是相关的;值越大,相关性越强两个词语是统计独立的,不相关也不互斥两个词语是不相关的,互斥的

    在文本中,两个词语的共线概率以及单个词语出现的概率都可以通过对预料集的统计得到:

    其中, 为预料集中文档总数; 表示单词 在多少篇文档中出现; 表示 和 同时在多少篇文档中出现。

    上式 公式给出了两个词语的相关性计算,可以得到两个词语的相似度度量,因此可以将 方法引入计算词语的情感倾向(Semantic Orientation, 简称 SO)中,从而达到捕获情感词的目的。

    基于点间互信息 算法的基本思想是:首先分别选用一组褒义词跟一组贬义词作为基准词,假设分别用 与 来表示这两组词语; 这些情感词必须是倾向性非常明显的,而且极具代表性的词语;若把一个单词 跟 的点间互信息之和减去 跟 的点间互信息之和会得到一个差值,就可以根据该差值判断词语 的情感倾向。公式如下:

    通常情况下,将 0 作为 算法的阈值,由此可得到三种状态:

    为正面倾向,即褒义词为中性倾向,即中性词为负面倾向,即贬义词

    考虑到网络用语词典可能存在中性词的情况,对上式假如一下条件场, 为阈值:

    当满足上面三个条件中的一个,则词汇归入中性词集,即 .在《中文文本情感词典构建方法》中,上面的 是通过搜索引擎查 两个单词在多少个页面中共同出现来算。

    考虑到中文用词的灵活性,遣词造句的差异性很大,严格按 算法来统计,会带来数据稀疏问题。所以我们可以考虑把基准情感词的同义词加入 计算,这样基准词 在所有语料数据集中的概率 就扩展为基准词 及其同义词在语料数据集中的概率 ; 也因此成为 与 及其同义词共现的概率。

    通过扩展后的 算法能够有效避免数据稀疏问题。

    情感倾向分析

    首先对文本进行分词,然后通过查事先准备好的情感词典表,以提取所有的情感词,并读取情感词对应的情感极性和权值。

    这种是比较明显的,但句子存在情感转移或情感极性反转等情况,比如“我不喜欢你”,“喜欢”是褒义词,但前面加个“不”否定一下,则整个句子就成了负面。

    否定词分析

    否定词是副词的一种,它是表示否定意义的词语,在文本中具有独特的语法意 义和影响。根据中文成句习惯,单重否定往往会改变情感极性,而双重否定表示肯定。

    所以我们可以对句子范围内检测情感词前面出现否定词的个数,如果为奇数就将情感词的极性反转,具体表现在情感词权值乘以 ;如果为偶数就可保持情感词的权值不变,或者适当提高,因为双重否定表示肯定,比直接肯定的语气更重。

    常见的否定词有:不、没、无、非、莫、弗、毋、勿、未、否、别、無 、休 不曾、未必、没有、不要、难以、未曾。

    程度副词分析

    程度副词也是副词的一种,副词一般用于修饰或限制动词与形容词,表示范围、 程度等。 “程度”是指某个量处于相应层次序列中的某个层级上,是量的层级表现。

    比如句子“这个小姐姐非常好看”,其中 “好看” 是褒义词,“非常”在前面修饰,加强了这种褒义程度。由此可知,程度副词的加入使用户在的情感倾向 强弱程度上发生了变化,仍需做相应处理。

    又如“太好看”和“特别好看”,“太”和“特别”这两个程度词表现的程度是不一样的,所以有人提出把程度副词划分为四个等级,即极量、高量、中量和低量,分别对应不同的权重。

    同否定词的处理方式一样,句子中检测情感词前面是否存在程度副词,如果存在,则将情感词的权值乘以程度副词的权重。

    其中需要事先准备好程度副词表,一般从《知网》的“中文程度级别词语”整理。

    感叹句分析

    感叹句是以抒发感情为主的句子,它所抒发的感情有赞美、愉悦、愤慨、叹息、 惊讶、哀伤等,句末通常都用感叹号来标识。通常感叹句是依附于它所在情感句的情 感极性,可以是对正面情感或者负面情感的程度加深。

    我们可以将感叹句中的情感词的权值加倍,或者乘以某一权重来加深这种情感;感叹句通过感叹号(“!”)来识别。

    反问句分析

    反问句的目的往往是加强语气,把原本的思想表达更加强烈、鲜明。它通常比陈述句 表达更为有力,感情色彩也更加明显。

    比如“难道我对你不够好么?”,“好”是褒义,“不够好”就变成了贬义,而反问“难道 ... ?”又将句子转换成了褒义,而且语气更强烈。

    反问句的存在可以通过反问标志来判断,可从语料中挑选出大量反问句并对反问标记词进行抽取,获得部分反问句标记词。类似感叹号, 反问句在句尾有疑问号“?”的出现,这给反问句的判断 提供了帮助。

    同感叹句的处理一样,先根据“?”来判断句子是否为疑问句,然后对疑问句检测反问标志词,判断是否为反问句。如果为反问句,就将句中情感词的权值直接乘以 ,以表示情感反转并加强。

    常用的反问标记词有:为什么、凭什么、难道、何必、怎能、怎么能、怎么会 怎会、哪能、能不、能没、不都、不也、不就、谁叫 谁让、就算、这算、还算、就不、还不、莫非 等等。

    表情符号分析

    对于网络文本,比如微博或者论坛等,平台都提供了丰富多彩的表情符号供用户选择。由于有些表情符号暗含了感情色彩,人们常用合适的表情来直接表达某种心情。

    比如“今天掉了100块钱[\大哭]”,其中整个句子汉字部分都是称述事实,不含情感色彩,但最后的表情符号“[\大哭]”就含有悲伤的情感。

    同基准情感词的处理一样,我们事先 人工挑选 暗含情感色彩的表情符号构成正负面表情符号表,并根据表达的情感程度不同而为不同的表情符号设置不同的权重;对句子进行分析时,之间提取句子中的情感表情符号及其对应的权重即可。

    如下是论文《基于情感词典的中文微博情感倾向分析》中给出的表情符号示例:

    情感倾向度加权计算

    情感倾向度是为了计算文本表达正面情感的程度或者负面情感的程度,一般我们把每条句子的情感值进行累加,得到整个文本的情感值;而句子的情感值根据上面的分析逻辑来算。

    根据标点符号将文本分割成 个句子: ,提取每个句子中的情感词 ,如果出现程度副词 修饰情感词 或者该句子是包含情感词的感叹句时,该情感词的情感倾向权重计算为:

    式中, 表示程度副词,或者感叹号“!”的权值, 是句子中情感词 的权值。

    当出现否定词 修饰情感词 时,为了实现其情感极性取反,则情感词的情感倾向权值公式为:

    式中, 表示否定词的权值, 是句子中情感词 的权值。

    假设句子 中包含 个情感词,即为 ,故该条句子的情感倾向度为:

    故含有 条句子的文本 最终的情感倾向度为:

    根据上式得到的最终情感倾向值 ,将会出现下列三种情况:

    为正面情感为中性情感为负面情感

    故根据最终的情感倾向值 所处的不同情况,判断该文本是属于正面、负面、或者中性的。

    小结

    笔者查阅过多种资料,基本上基于情感词典的情感分析方法都如上面所述,大同小异,所以其他的不做过多讲解

    这种方法依赖于情感词典的完善程度,需要大量的情感词典做多模式匹配,所以高效的匹配算法对工程实现来说是有价值的,可参考笔者之前写的《双数组字典树》一篇。

    参考《基于情感词典的中文微博情感倾向分析研究》

    《中文文本情感词典构建方法》

    《sentiment analysis and opinion mining》

    《面向文本情感分析的中文情感词典构建方法》

    展开全文
  • 【实例简介】(全)包括知网Hownet情感词典,台湾大学NTUSD简体中文情感词典,情感词汇本体,情感词典及其分类,清华大学李军中文褒贬义词典,汉语情感词极值表,否定词典,褒贬词及其近义词【实例截图】【核心代码】...

    【实例简介】

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

    【实例截图】

    【核心代码】

    SentimentAnalysisDic

    └── SentimentAnalysisDic

    ├── 知网Hownet情感词典

    │   ├── 主张词语(中文).txt

    │   ├── 主张词语(英文).txt

    │   ├── 正面情感词语(中文).txt

    │   ├── 正面情感词语(英文).txt

    │   ├── 正面评价词语(中文).txt

    │   ├── 正面评价词语(英文).txt

    │   ├── 程度级别词语(中文).txt

    │   ├── 程度级别词语(英文).txt

    │   ├── 负面情感词语(中文).txt

    │   ├── 负面情感词语(英文).txt

    │   ├── 负面评价词语(中文).txt

    │   └── 负面评价词语(英文).txt

    ├── 否定词典

    │   └── 否定.txt

    ├── 台湾大学NTUSD简体中文情感词典

    │   ├── NTUSD_negative_simplified.txt

    │   ├── NTUSD_positive_simplified.txt

    │   ├── ntusd-negative.txt

    │   └── ntusd-positive.txt

    ├── 情感词汇本体

    │   ├── 情感词汇本体.xlsx

    │   └── 情感词汇本体库说明文档.doc

    ├── 情感词典及其分类

    │   └── 情感词典及其分类.xls

    ├── 汉语情感词极值表

    │   └── 汉语情感词极值表.txt

    ├── 褒贬词及其近义词

    │   └── 褒贬词及其近义词.xls

    └── 清华大学李军中文褒贬义词典

    ├── tsinghua.negative.gb.txt

    └── tsinghua.positive.gb.txt

    9 directories, 24 files

    展开全文
  • 5.台湾大学NTUSD情感词典;6.知网情感词典;7.汉语情感极值表;8.情感词典及其分类。【实例截图】【核心代码】SentimentAnalysisDic`-- SentimentAnalysisDic|-- 知网Hownet情感词典| |-- 主张词语(中文).txt| |-- ...

    【实例简介】

    1.褒义词及其近义词;2.否定词典;3.情感词汇本体;4.清华大学中文褒贬词典;5.台湾大学NTUSD情感词典;6.知网情感词典;7.汉语情感极值表;8.情感词典及其分类。

    【实例截图】

    【核心代码】

    SentimentAnalysisDic

    `-- SentimentAnalysisDic

    |-- 知网Hownet情感词典

    | |-- 主张词语(中文).txt

    | |-- 主张词语(英文).txt

    | |-- 正面情感词语(中文).txt

    | |-- 正面情感词语(英文).txt

    | |-- 正面评价词语(中文).txt

    | |-- 正面评价词语(英文).txt

    | |-- 程度级别词语(中文).txt

    | |-- 程度级别词语(英文).txt

    | |-- 负面情感词语(中文).txt

    | |-- 负面情感词语(英文).txt

    | |-- 负面评价词语(中文).txt

    | `-- 负面评价词语(英文).txt

    |-- 否定词典

    | `-- 否定.txt

    |-- 台湾大学NTUSD简体中文情感词典

    | |-- NTUSD_negative_simplified.txt

    | |-- NTUSD_positive_simplified.txt

    | |-- ntusd-negative.txt

    | `-- ntusd-positive.txt

    |-- 情感词汇本体

    | |-- 情感词汇本体.xlsx

    | `-- 情感词汇本体库说明文档.doc

    |-- 情感词典及其分类

    | `-- 情感词典及其分类.xls

    |-- 汉语情感词极值表

    | `-- 汉语情感词极值表.txt

    |-- 褒贬词及其近义词

    | `-- 褒贬词及其近义词.xls

    `-- 清华大学李军中文褒贬义词典

    |-- tsinghua.negative.gb.txt

    `-- tsinghua.positive.gb.txt

    9 directories, 24 files

    展开全文
  • 基于情感词典的情感分析

    万次阅读 多人点赞 2018-01-19 23:05:26
    思路以及代码都来源于下面两篇文章:一个不知死活的胖子: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("我今天很高兴也非常开心"))

    展开全文
  • 中文情感词典

    2019-01-03 14:02:20
    自然语言处理使用的情感词典,包括知网词典、台湾大学NTUSD、清华大学李军、Bosen情感词典、否定词词典等
  • 情感词典列表

    2018-04-06 15:07:46
    情感词典及分类,很不错啊。 情感词典及分类,很不错啊
  • 情感词典分享

    2019-01-15 15:44:20
    今天找词库找得很苦,非得要积分很麻烦,明明...这里我下载了知网的开源情感词典和大连理工的开源情感词典,分享在这里,后面是提取地址,请大家走链接: https://pan.baidu.com/s/1GBn9TY1Fuggq-2SQJP5QVg 提取码: 8zyt
  • 用python实现基于情感词典的情感分析 大数据分析 用python实现基于情感词典的情感分析 大数据分析 用python实现基于情感词典的情感分析 大数据分析 用python实现基于情感词典的情感分析 大数据分析
  • 情感分析-情感词典

    2018-05-10 17:40:25
    台湾大学情感词典,包含8276个neg_word,2810个pos_word.
  • 用于中文情感分析的,情感词典,包括正面情感词,负面情感词和程度副词
  • 原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动)。论文在这里下载:基于情感词典的中文微博情感倾向性研究(大家可以上知网自行...
  • (全)包括知网Hownet情感词典,台湾大学NTUSD简体中文情感词典,情感词汇本体,情感词典及其分类,清华大学李军中文褒贬义词典,汉语情感词极值表,否定词典,褒贬词及其近义词
  • PythonPython开发Python语言基于情感词典的python情感分析 近期老师给我们安排了一个大作业,要求根据情感词典对微博语料进行情感分析。于是在网上狂找资料,看相关书籍,终于搞出了这个任务。现在做做笔记,总结...
  • 商品评论情感倾向性分析中,整理的情感词典,来源包括知网、台湾大学情感词库、大连理工情感词汇本体、《褒义词词典》、《贬义词词典》。包含情感词29869个,另外还有否定词、关联词、程度副词三种辅助词。
  • 基于情感词典进行情感态度分析

    万次阅读 多人点赞 2018-12-19 19:26:30
    情感分析是指挖掘文本表达的观点,识别主体对某客体的评价是褒还是贬,褒贬...我所使用的方法是基于语义理解中的使用情感词典进行情感态度分析。 下面是我所使用的情感词典: 链接:HTTPS://pan.baidu.com/s/1xC...
  • 情感分析词典,包含hownet词典、台湾大学NTUSD简体中文情感词典、清华大学李军中文褒贬义词典、BosonNLP词典、大连理工大学中文情感词汇本体库
  • 基于情感词典的文本情感分类传统的基于情感词典的文本情感分类,是对人的记忆和判断思维的最简单的模拟,如上图。我们首先通过学习来记忆一些基本词汇,如否定词语有“不”,积极词语有“喜欢”、“爱”,消极词语有...
  • 中文情感词典合计

    2019-01-03 07:43:47
    中文情感词汇本体库+知网程度级别词语词典+清华大学李军中文褒贬义词典 +台湾中文大学-NTUSD情感词典
  • 基于情感词典的藏语文本句子情感分类
  • 中文情感词典合集

    2017-11-06 17:13:35
    中文情感词典合集TXT+XLS+DOC :知网Hownet情感词典+清华大学李军中文褒贬义词典...
  • 大连理工情感词典

    2016-11-27 21:38:45
    情感词典 大连理工 execl词典
  • 英文文本情感分析中非常出名的情感词典sentiwordnet,适用于NLP

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 783
精华内容 313
关键字:

情感词典