一、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