论文-基于情感词典(1030,方法改进+测试集预测)

一、15.py相邻的两个情感词之间的词语已经进行判断,不需要重复判断for改为while

1、由于已经对相邻得两个情感词中间得词语进行了判断,所以不需要重复判断,
2、 for循环会循规蹈矩的重复判断,所以我们使用while循环
3、问题:就是分数在不停得叠加,所以导致负值较小,正值较大,就会发生抵消,导致结果最终是正值,怎么避免抵消?

def score_sentiment(sen_word, not_word, degree_word, seg_result):
    # 权重初始化为1
    w = 1
    score = 0
    # 情感词下标初始化
    sentiment_index = -1
    # 情感词的位置下标集合
    sentiment_index_list = list(sen_word.keys()) # [1, 3]

    # 对第一个情感词前的程度副词或者否定词进行得分处理!!!!!!!
    # print(sentiment_index_list)
    if len(sentiment_index_list) > 1:
        for j in range(0, sentiment_index_list[0]): # 查看第一个情感词的位置下标之前有没有否定词和程度副词(可能情感词为空,注意报错)
            if j in not_word.keys():
                w = w * float(not_word[j]) # 否定词的极性固定为-1
            elif j in degree_word.keys():
                w = w * float(degree_word[j])
    i = 0
    while i < len(seg_result):
        # 如果是情感词
        if i in sen_word.keys():
            score = score + w * abs(float(sen_word[i]))
            # w一定要初始化一下 每个W只跟你所对应的情感词有关系
            w = 1.0
            # 情感词下标加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():
                        score = score * float(not_word[j])
                    elif j in degree_word.keys():
                        w = w * float(degree_word[j])
                i = sentiment_index_list[sentiment_index + 1]
            else:
                i += 1
        elif i in not_word:
            score = score * (float(not_word[i]))
            i += 1
        elif i in degree_word:
            score = score * (float(degree_word[i]))
            i += 1
        else:
            i += 1
    return score

二、16.py扩展否定词列表,先判断否定词,再判断情感词

1、很多负面的句子被辨别为正面,是因为没有识别到否定词,所以尝试对否定词列表进行扩展,查看最终的输出效果
2、由于先判断情感词,再判断否定词,导致"太少"属于情感词,而不计入否定词,于是调换顺序,先判断否定词
3、由于最开始找到否定词,w为负,但是情感词里面,w也是负,导致,负负得正,输出得分数为正,修改情感词程度

import csv
from collections import defaultdict
import jieba


def classify_words(word_list):
    sen_file = open('BosonNLP_sentiment_score.txt','r+',encoding='utf-8')
    sen_list = sen_file.readlines()
    sen_dict = defaultdict()
    for i in sen_list:
        if len(i.split(' ')) == 2:
            sen_dict[i.split(' ')[0]] = i.split(' ')[1]
    # print('sen_dict', sen_dict)
    not_word_file = open('否定词_degree.txt', 'r+', encoding = 'utf-8')
    not_word_list = not_word_file.readlines()
    not_word_dict = defaultdict()
    for i in not_word_list:
        not_word_dict[i.split(',')[0]] = i.split(',')[1]
    degree_file = open('程度副词.txt', 'r+', encoding = 'utf-8')
    degree_list = degree_file.readlines()
    degree_dict = defaultdict()
    for i in degree_list:
        degree_dict[i.split(',')[0]] = i.split(',')[1]

    sen_word = dict()
    not_word = dict()
    degree_word = dict()

    # 分类
    for i in range(len(word_list)):
        word = word_list[i]  # 遍历每一个单词
        # 先判断是否在否定词的列表内
        if word in not_word_dict.keys():
            # 加入否定词和否定词对应的极性
            not_word[i] = not_word_dict[word]
        elif word in sen_dict.keys() and word not in degree_dict.keys():
            # 属于情感词,不属于否定词,不属于程度副词
            sen_word[i] = sen_dict[word]
        elif word in degree_dict.keys():
            degree_word
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值