基于情感词典的语义分析
好久没更了,前两天在打美赛,整了点好玩的东西,贴上来
基于情感词典的语义识别(python)
美赛中的一道题目,要求我们对用户的一段对于商品的回复来提取其表达的情感,从而用以对用户给出的评分作为参考的依据,总的来说就是,一段话——>一个权值
用到了pandas框架来处理exel,因为题目给出的数据集是tsv格式的
算法比较暴力,也比较无聊,就图一乐
首先贴上情感字典的链接 ——> http://www.keenage.com/html/c_bulletin_2007.htm
首先是对情感词典进行处理,这套情感词典分为,中文,英文
然后下面分为 正面评价 正面感情,负面评价,负面感情,程度词语,几种不同的txt文件
可惜的是没有对其进行程度的打标
因此第一步
数据预处理
正面评价和正面感情词语标记为 1
负面评价和负面感情词语标记为 -1
程度词语,根据不同程度,分别标记为
very = {
1:'./1#较.txt',
2:'./2#超级.txt',
2.5:'./2.5#最.txt',
1.5:'./1.5#很.txt',
0.5:'./0.5#欠.txt'
}
(手动处理)
数据处理完成
读入tsv数据,切分词语
import pandas as pd
reader = pd.read_csv('./dataset/result.tsv',sep='\t',usecols=['review_headline','review_body'])
for row in reader.iterrows():
review = str(row[1].values[0])+' '+str(row[1].values[1])
words = review.split(' ') #通过空格将英文单词分开(中文肯定不行啦)
score = int()
word_n = int()
for key in score_dict:
j = int() #用于记录word在列表中的位置
for word in words: #对一句话中每个单词进行遍历
j = j+1
if word!= '\n':
if word in score_dict[key] and word!=' ' and word!='\n': #查找这个word是否在情感词典里面
word_n = word_n+1
#print('匹配'+word)
level_score = query_level(j,key) #查找定位到的word前面几个单词是否是程度性词语(英文语法是这样的)
score = score + level_score
if word_n != 0:
rate = score/word_n
else:
rate = 0
score_list.append(score)
rate_list.append(rate)
这个函数,i是搜索到的关键词word的位置,score是这个word是一个负面还是正面的分数
def query_level(i,score): #查找程度词语函数
#print(score)
score = score_[score]
if i >2 :
for key in level_dict:
if words[i-1] in level_dict[key] or words[i-2] in level_dict[key]:
level_score = score*key #程度词的权值乘以+1或者-1
#print('程度'+words[i-1])
return level_score #查到返回
else :
return score #查不到返回正负1
else:
return score
输出
min = min(score_list)
max = max(score_list)
result_list = list()
for score in score_list:
result = (score - min)/(max-min)
result_list.append(result)
reader['result'] = result_list
reader.to_csv(r"result.tsv",mode = 'a',index =False)
print(rate_list)
print(result_list)
with open('result_list1.txt','w')as f:
f.writelines(str(result_list))
with open('score_list1.txt','w') as f:
f.writelines(str(score_list))
输出的结果还是蛮喜人的
这只是根据语义中的词语来计算score,输出的内容可以自己通过其他办法进行处理