基于情感词典的语义分析

基于情感词典的语义分析

好久没更了,前两天在打美赛,整了点好玩的东西,贴上来
基于情感词典的语义识别(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))
输出的结果还是蛮喜人的


image.png

这只是根据语义中的词语来计算score,输出的内容可以自己通过其他办法进行处理

你可能感兴趣的:(基于情感词典的语义分析)