中文情感词库_情感识别

中文情感词库_情感识别目录一一

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺


前言

文本情感倾向性分析(也称为意见挖掘)是指识别和提取原素材中的主观信息,并对带有感情色彩的文本进行分析处理和归纳推理的过程。主要用于实时社交媒体的内容,如微博评论等。而BosonNLP情感词典是从微博、新闻、论坛等数据来源的上百万篇情感标注数据当中自动构建的情感极性词典。因为标注包括微博等网络社交媒体平台的数据,该词典囊括了很多网络用语及非正式简称,对非规范文本也有较高的覆盖率。本文主要基于BosonNLP情感词典,同时使用程度副词词典和否定词词典(借助《知网》情感分析用词语集等文本构建)和哈工大停用词表,共同通过情感打分的方式进行(这里以前文《利用Python系统性爬取微博评论》https://blog.csdn.net/kutalx/article/details/115242052)中获取的评论数据为依托)的情感倾向性分析。


提示:代码实现部分参考了文章Python做文本情感分析之情感极性分析的内容,并在其基础上进行了优化,以适配个人需求。

一、模型构建

1.归类

采用的手段为遍历匹配相应的词性词典并对每条评论建立对应的位置词典。分词后文本内的所有词语彼此独立,故对于每一条评论,将其内部的每一个词分别归类于“情感词”、“否定词”、“程度词”和“其它词”四类中。具体步骤为先读取情感词典、否定词词典和程度副词词典,转化为“词语-分值”映射关系;再读取一条分词后评论,新建三个位置词典,内含“位置-分值”映射关系,依次对每个词进行分类,将每个词的位置录入对应的位置词典中。

2.判定

采用的手段为遍历每条评论的位置信息,输出情感分数。一条评论的初始分数为0;按位置遍历内部词语,若一个词被判定为“情感词”,则按照情感位置词典读取分数;若两个“情感词”之间有词语被判定为“否定词”或“程度词”,则按照否定位置词典或程度位置词典读取分数(“否定词”实则皆为-1),将之与后一个“情感词”分数相乘;最后将一条评论的所有情感词分数相加,得其总分数。算式如下:
S w = ( − 1 ) N n ∗ ∑ i = 1 N d D s ∗ S o S_w=(-1)^{N_n}*\sum_{i=1}^{N_d} D_s*S_o Sw=(1)Nni=1NdDsSo
S s = ∑ i = 1 N o S o S_s=\sum_{i=1}^{N_o} S_o Ss=i=1NoSo
其中, S w S_w Sw为单一情感词的最终分数, N n N_n Nn N o N_o No为前缀否定词和程度词的数 D s D_s Ds S o S_o So为前缀每个程度词的分数和单一情感词的原始分数; S s S_s Ss为一票评论的最终分数, N o N_o No为该评论类情感词的个数。

3.输出

每部作品有多条评论,每条评论的分值分布是离散的。将评论分值划分为五个等级:5(正面),4(偏正面),3(中性),2(偏负面),1(负面)。根据分值的分布特征,算式如下:
D e g r e e = { 5 S s ≥ 3 4 0.5 ≤ S s < 3 3 − 0.5 < S s < 0.5 2 − 3 < S s ≤ − 0.5 1 S s ≤ − 3 Degree=\left\{ \begin{array}{rcl} 5 & & {S_s≥3}\\ 4 & & {0.5≤S_s<3}\\ 3 & & {-0.5<S_s<0.5}\\ 2 & & {-3<S_s≤-0.5}\\ 1 & & {S_s≤-3} \end{array} \right. Degree=54321Ss30.5Ss30.5<Ss<0.53<Ss0.5Ss3
由此即可得整体情感倾向水平。

情感分析流程图
流程如上;其中,“文件5”为评论文本文档,以微博id命名方便后续对应读取。

二、代码实现

使用python实现模型,代码如下:

from collections import defaultdict
import os
import re
import jieba
import codecs
def classifyWords(wordDict):
    senList = open(存储路径-情感词典).readlines()
    senDict = defaultdict()
    for s in senList:
        ls=s.split(' ',1)
        if len(ls)==2:
            senDict[ls[0]] = ls[1]
    notList = open(存储路径-否定词典).readlines()
    degreeList = open(存储路径-程度词典).readlines()
    degreeDict = defaultdict()
    for d in degreeList:
        ls2 = d.split(',', 1)
        if len(ls2) == 2:
            degreeDict[ls2[0]] = ls2[1]
    senWord = defaultdict()
    notWord = defaultdict()
    degreeWord = defaultdict()
    for word in wordDict.keys():
        if word in senDict.keys() and word not in notList and word not in degreeDict.keys():
            senWord[wordDict[word]] = senDict[word]
        elif word in notList and word not in degreeDict.keys():
            notWord[wordDict[word]] = -1
        elif word in degreeDict.keys():
            degreeWord[wordDict[word]] = degreeDict[word]
    return senWord, notWord, degreeWord
def scoreSent(senWord, notWord, degreeWord, segResult):
    W = 1
    score = 0
    senLoc = senWord.keys()
    notLoc = notWord.keys()
    degreeLoc = degreeWord.keys()
    senloc = -1
    for i in range(0, len(segResult)):
        if i in senLoc:
            senloc += 1
            score += W * float(senWord[i])
            if senloc < len(senLoc) - 1:
                for j in range(list(senLoc)[senloc], list(senLoc)[senloc + 1]):
                    if j in notLoc:
                        W *= -1
                    if j in degreeLoc:
                        W *= float(list(degreeWord)[j])
        if senloc < len(senLoc) - 1:
            i = list(senLoc)[senloc + 1]
    return score
uid=#微博id列表
for n in uid:#多个微博的评论文本分别评分
    txt = open(存储路径-文件5).readlines()
    stop = open(存储路径-停用词表).readline()
    line=[]
    for i in range(len(txt)):
        line.append(list(jieba.cut(txt[i])))
    ScoreList=[]
    for i in range(len(line)):
        words=line[i]
        num=list(range(0,len(words)))
        d=dict(zip(words,num))
        s,no,d=classifyWords(d)
        Score=scoreSent(s, no, d, words)
        ScoreList.append(Score)
    VBIG=0
    BIG=0
    SMALL=0
    VSMALL=0
    MID=0
    for score in ScoreList:
        if score>=3:
            VBIG=VBIG+1
        elif score>=0.5:
            BIG=BIG+1
        elif score>=-0.5:
            MID=MID+1
        elif score>-3:
            SMALL=SMALL+1
        else:
            VSMALL=VSMALL+1
    print(VBIG,BIG,MID,SMALL,VSMALL)
    print("---")

三、结果展示

六部作品评论的情感倾向水平
分别选取《山海情》《大江大河2》《巡回检察组》《金刚川》《我和我的祖国》《中国机长》六部作品对应的官方微博下的所有评论,使用上述模型进行分析,结果如上。
在《山海情》19996条评论中,“正面”、“偏正面”、“中性”、“偏负面”、“负面”评论对应的数目分别为7268条,5771条,3042条2946条和969条;在《大江大河2》48264条评论中,分别有24289条,10445条,5518条5582条和2430条;在《巡回检察组》20090条评论中,分别有4577条,5173条,3751条,4356条和2233条;在《金刚川》7296条评论中,分别有4016条,1600条,714条700条和266条;在《我和我的祖国》38053条中,分别有24772条,6855条,3039条2579条和808条;在《中国机长》16900条中,分别有7747条,4231条,2343条1951条和628条。
可以看出,每部作品的正面评价往往略多于或远多于消极评价,符合实际网络评论的情况;而《巡回检察组》相对而言具有最差的口碑,这也符合客观观看评价的情况。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172447.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月23日 上午6:36
下一篇 2022年8月23日 上午6:46


相关推荐

  • SortableJS的简单使用

    SortableJS的简单使用SortableJsht 里面也介绍了该库的一些特性 中文网的页面十分简约方便阅读 有着满足我们需要的示例介绍 只有几个页面 在配置项一栏列举了很多的方法 下面就在 html 里面实现一下简单的 demo

    2026年3月18日
    1
  • 使用云服务器NAS搭建个人网盘[通俗易懂]

    使用云服务器NAS搭建个人网盘[通俗易懂]安装OwnCloudOwnCloud是一款开源的云存储软件,基于PHP的自建网盘。基本上是私人使用,没有用户注册功能,但是有用户添加功能,你可以无限制地添加用户,OwnCloud支持多个平台(windows,MAC,Android,IOS,Linux)添加一个新的软件源rpm–importhttps://download.owncloud.org/download/repositories/10.0/CentOS_7/repodata/repomd.xml.keywgethttp://d

    2022年4月19日
    104
  • C语言实现俄罗斯方块

    C语言实现俄罗斯方块使用 C 语言完成俄罗斯方块 俄罗斯方块 的基本规则是移动 旋转和摆放游戏自动输出的各种方块 使之排列成完整的一行或多行并且消除得分 由小方块组成的不同形状的板块陆续从屏幕上方落下来 玩家通过调整板块的位置和方向 使它们在屏幕底部拼出完整的一条或几条 这些完整的横条会随即消失 给新落下来的板块腾出空间 与此同时 玩家得到分数奖励 没有被消除掉的方块不断堆积起来 一旦堆到屏幕顶端 玩家便告输 游戏结束 顾名思义 俄罗斯方块自然是俄罗斯人发明的

    2026年3月19日
    2
  • DSP之CCS软件使用一「建议收藏」

    1、创建新的工程文件:选择菜单“Project”的“New…”项。2、在工程文件中添加程序文件:新增文件分别为*.c,.cmd,evmdm6437bsl.lib,.h文件。方法:(1)找到C盘下C:\CCStudio_v3.3\boards\ICETEK-DM6437-B_V2\test\Lab0101_UseCCS\UseCCS\UseCCS.C文件。(2)C:\CCStudio…

    2022年4月7日
    52
  • 基于Gitflow分支模型自动化Java项目工作流

    基于Gitflow分支模型自动化Java项目工作流

    2021年7月1日
    78
  • Visual Studio 2019 Community 离线注册教程「建议收藏」

    Visual Studio 2019 Community 离线注册教程「建议收藏」VS2019社区版是免费的,但是需要登录微软账户,不登录只能使用30天,30天之后就无法使用了,如下图:首先使用能够访问外网的电脑登录微软账户注册VS。也可以使用我这个Licensing,直接进入第三步 找到注册文件,路径:C:\Users\{系统登录用户}\AppData\Local\Microsoft\VSCommon 将两个文件夹复制到需要注册的电脑上,路径:C:\…

    2022年10月13日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号