当前位置:   article > 正文

基于情感词典的文本情感分析_中文文本情感评分

中文文本情感评分

原代码来源:https://blog.csdn.net/lom9357bye/article/details/79058946

本文是对原代码的几个bug进行了修复,用到的词典可由以上链接下载

 

  1. import codecs
  2. from collections import defaultdict
  3. import jieba
  4. import xlrd
  5. # 分词,去除停用词
  6. def seg_word(sentence):
  7.     # 分词
  8.     seg_list = jieba.cut(sentence)
  9.     seg_result = []
  10.     for w in seg_list:
  11.         seg_result.append(w)
  12.     # 读取停用词
  13.     stopwords = set()  # 集合
  14.     fr = codecs.open('stopwords.txt', 'r', 'utf-8')
  15.     for word in fr:
  16.         stopwords.add(word.strip())
  17.     fr.close()
  18.     # 去除停用词
  19.     return list(filter(lambda x: x not in stopwords, seg_result))
  20. # 对分词结果分类:情感词、否定词、程度副词
  21. # key为索引,value为权值
  22. def classify_words(word_list):
  23.     # 读取情感字典
  24.     sen_file = open('BosonNLP_sentiment_score.txt', 'r+', encoding='utf-8')
  25.     # 获取字典内容
  26.     # 去除'\n'
  27.     sen_list = sen_file.read().splitlines()
  28.     # 创建情感字典
  29.     sen_dict = defaultdict()
  30.     # 读取字典文件每一行内容,将其转换为字典对象,key为情感词,value为对应的分值
  31.     for s in sen_list:
  32.         # 对每一行内容根据空格分隔,索引0是情感词,1是情感分值
  33.         if len(s.split(' ')) == 2:
  34.             sen_dict[s.split(' ')[0]] = s.split(' ')[1]
  35.     # 读取否定词文件
  36.     not_word_file = open('notDic.txt', 'r+', encoding='utf-8')
  37.     # 否定词没有分值,使用列表
  38.     not_word_list = not_word_file.read().splitlines()
  39.     # 读取程度副词文件
  40.     degree_file = open('degree.txt', 'r+', encoding='utf-8')
  41.     degree_list = degree_file.read().splitlines()
  42.     degree_dic = defaultdict()
  43.     # 程度副词转为字典对象,key为词,value为权值
  44.     for d in degree_list:
  45.         degree_dic[d.split(',')[0]] = d.split(',')[1]
  46.     # 分类结果,词语索引为key,分值为value,否定词分值为-1
  47.     sen_word = dict()
  48.     not_word = dict()
  49.     degree_word = dict()
  50.     # 分类
  51.     for word in word_list:
  52.         if word in sen_dict.keys() and word not in not_word_list and word not in degree_dic.keys():
  53.             # 找出分词结果中在情感字典中的词
  54.             sen_word[word] = sen_dict[word]
  55.         elif word in not_word_list and word not in degree_dic.keys():
  56.             # 分词结果中在否定词列表中的词
  57.             not_word[word] = -1
  58.         elif word in degree_dic.keys():
  59.             # 分词结果中在程度副词中的词
  60.             degree_word[word] = degree_dic[word]
  61.     sen_file.close()
  62.     degree_file.close()
  63.     not_word_file.close()
  64.     # 将分类结果返回
  65.     # 词语索引为key,分值为value,否定词分值为 - 1
  66.     return sen_word, not_word, degree_word
  67. # 计算每个情感词得分,再相加
  68. def score_sentiment(sen_word, not_word, degreen_word, seg_result):
  69.     # 权重初始化为1
  70.     W = 1
  71.     score = 0
  72.     # 遍历分词结果
  73.     for i in range(0, len(seg_result)):
  74.         # 若是程度副词
  75.         if seg_result[i] in degreen_word.keys():
  76.             W *= float(degreen_word[seg_result[i]])
  77.         # 若是否定词
  78.         elif seg_result[i] in not_word.keys():
  79.             W *= -1
  80.         elif seg_result[i] in sen_word.keys():
  81.             score += float(W) * float(sen_word[seg_result[i]])
  82.             W = 1
  83.     return score
  84. # 调度各函数
  85. def sentiment_score(sentence):
  86.     # 1.分词
  87.     seg_list = seg_word(sentence)
  88.     # 2.将分词结果转为dic,再分类
  89.     sen_word, not_word, degree_word = classify_words(seg_list)
  90.     # 3.计算得分
  91.     score = score_sentiment(sen_word, not_word, degree_word, seg_list)
  92.     return score
  93. if __name__ == '__main__':
  94.     score=sentiment_score('我很开心。')
  95. print(score)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/496365
推荐阅读
相关标签
  

闽ICP备14008679号