当前位置:   article > 正文

python nlp情感分析之极性分析_bosonnlp情感词典下载

bosonnlp情感词典下载

背景

目前做情感分析基本使用机器学习或者深度学习进行情感分析,准确率已经很高了。最近与某高校新闻媒体学院合作进行大数据情感分析,学院老师要求采用情感字典进行情感极性分析,之前做项目情感分析都是采用深度模型做的,这次打算使用情感字典进行情感极性分析,并且以后可以用来收集数据。

1.数据准备

1.1 情感词典准备

话说是基于情感词典的极性分析,当然要有情感字典,可以采用下面的链接直接下载。

https://bosonnlp.com/resources/BosonNLP_sentiment_score.zip

解压缩之后可以看到BosonNLP_sentiment_score.txt文件,里面的数据如下:

  1. 如虎添翼 6.37503943135
  2. 定购 6.37503943135
  3. 富婆团 6.37503943135
  4. 赖世荣 6.37503943135

这里挑选了几个正面的词语,分为两列,第一列为情感词,第二列情感词的情感值,越大代表越正面。

1.2 否定词

文本情感分类(一):传统模型中提供了一个情感极性词典的下载包,包中带了一个否定词的txt。

https://kexue.fm/usr/uploads/2017/09/1922797046.zip

  1. 不大
  2. 不丁点儿
  3. 不甚
  4. 不怎么
  5. 没怎么
  6. 不可以
  7. 怎么不
  8. 几乎不
  9. 从来不
  10. 从不
  11. 不用
  12. 不曾
  13. 不该
  14. 不必
  15. 不会
  16. 不好
  17. 不能
  18. 很少
  19. 极少
  20. 没有
  21. 不是
  22. 难以
  23. 放下
  24. 扼杀
  25. 终止
  26. 停止
  27. 放弃
  28. 反对
  29. 缺乏
  30. 缺少
  31. 木有
  32. 请勿
  33. 无须
  34. 并非
  35. 毫无
  36. 决不
  37. 休想
  38. 永不
  39. 不要
  40. 未尝
  41. 未曾
  42. 从未
  43. 从未有过
  44. 尚未
  45. 一无
  46. 并未
  47. 尚无
  48. 从没
  49. 绝非
  50. 远非
  51. 切莫
  52. 绝不
  53. 毫不
  54. 禁止
  55. 拒绝
  56. 杜绝

1.3 程度副词词典

程度副词可以使用从这里《知网》情感分析用词语集(beta版)下载,里面包含程度级别的词语,但是里面的格式是汇总的形式,需要转换为词典的形式,这里做了一个简单的程度副词标记,大于1,表示情感加强,小于1,表示情感弱化,下面主要按照极其1.8,超1.6,很1.5,较1,稍0.7,欠0.5进行了一个简单的标记,如下所示。也可以根据自己的需求及及进行修改。

  1. 百分之百,1.8
  2. 倍加,1.8
  3. 备至,1.8
  4. 不得了,1.8
  5. 不堪,1.8
  6. 不可开交,1.8
  7. 不亦乐乎,1.8
  8. 不折不扣,1.8
  9. 彻头彻尾,1.8
  10. 充分,1.8
  11. 到头,1.8
  12. 地地道道,1.8
  13. 非常,1.8
  14. 极,1.8
  15. 极度,1.8
  16. 极端,1.8
  17. 极其,1.8
  18. 极为,1.8
  19. 截然,1.8
  20. 尽,1.8
  21. 惊人地,1.8
  22. 绝,1.8
  23. 绝顶,1.8
  24. 绝对,1.8
  25. 绝对化,1.8
  26. 刻骨,1.8
  27. 酷,1.8
  28. 满,1.8
  29. 满贯,1.8
  30. 满心,1.8
  31. 莫大,1.8
  32. 奇,1.8
  33. 入骨,1.8
  34. 甚为,1.8
  35. 十二分,1.8
  36. 十分,1.8
  37. 十足,1.8
  38. 死,1.8
  39. 滔天,1.8
  40. 痛,1.8
  41. 透,1.8
  42. 完全,1.8
  43. 完完全全,1.8
  44. 万,1.8
  45. 万般,1.8
  46. 万分,1.8
  47. 万万,1.8
  48. 无比,1.8
  49. 无度,1.8
  50. 无可估量,1.8
  51. 无以复加,1.8
  52. 无以伦比,1.8
  53. 要命,1.8
  54. 要死,1.8
  55. 已极,1.8
  56. 已甚,1.8
  57. 异常,1.8
  58. 逾常,1.8
  59. 贼,1.8
  60. 之极,1.8
  61. 之至,1.8
  62. 至极,1.8
  63. 卓绝,1.8
  64. 最为,1.8
  65. 佼佼,1.8
  66. 郅,1.8
  67. 綦,1.8
  68. 齁,1.8
  69. 最,1.8
  70. 不过,1.5
  71. 不少,1.5
  72. 不胜,1.5
  73. 惨,1.5
  74. 沉,1.5
  75. 沉沉,1.5
  76. 出奇,1.5
  77. 大为,1.5
  78. 多,1.5
  79. 多多,1.5
  80. 多加,1.5
  81. 多么,1.5
  82. 分外,1.5
  83. 格外,1.5
  84. 够瞧的,1.5
  85. 够戗,1.5
  86. 好,1.5
  87. 好不,1.5
  88. 何等,1.5
  89. 很,1.5
  90. 很是,1.5
  91. 坏,1.5
  92. 可,1.5
  93. 老,1.5
  94. 老大,1.5
  95. 良,1.5
  96. 颇,1.5
  97. 颇为,1.5
  98. 甚,1.5
  99. 实在,1.5
  100. 太,1.5
  101. 太甚,1.5
  102. 特,1.5
  103. 特别,1.5
  104. 尤,1.5
  105. 尤其,1.5
  106. 尤为,1.5
  107. 尤以,1.5
  108. 远,1.5
  109. 着实,1.5
  110. 曷,1.5
  111. 碜,1.5
  112. 大不了,0.8
  113. 多,0.8
  114. 更,0.8
  115. 更加,0.8
  116. 更进一步,0.8
  117. 更为,0.8
  118. 还,0.8
  119. 还要,0.8
  120. 较,0.8
  121. 较比,0.8
  122. 较为,0.8
  123. 进一步,0.8
  124. 那般,0.8
  125. 那么,0.8
  126. 那样,0.8
  127. 强,0.8
  128. 如斯,0.8
  129. 益,0.8
  130. 益发,0.8
  131. 尤甚,0.8
  132. 逾,0.8
  133. 愈,0.8
  134. 愈 ... 愈,0.8
  135. 愈发,0.8
  136. 愈加,0.8
  137. 愈来愈,0.8
  138. 愈益,0.8
  139. 远远,0.8
  140. 越 ... 越,0.8
  141. 越发,0.8
  142. 越加,0.8
  143. 越来越,0.8
  144. 越是,0.8
  145. 这般,0.8
  146. 这样,0.8
  147. 足,0.8
  148. 足足,0.8
  149. 点点滴滴,0.7
  150. 多多少少,0.7
  151. 怪,0.7
  152. 好生,0.7
  153. 还,0.7
  154. 或多或少,0.7
  155. 略,0.7
  156. 略加,0.7
  157. 略略,0.7
  158. 略微,0.7
  159. 略为,0.7
  160. 蛮,0.7
  161. 稍,0.7
  162. 稍稍,0.7
  163. 稍微,0.7
  164. 稍为,0.7
  165. 稍许,0.7
  166. 挺,0.7
  167. 未免,0.7
  168. 相当,0.7
  169. 些,0.7
  170. 些微,0.7
  171. 些小,0.7
  172. 一点,0.7
  173. 一点儿,0.7
  174. 一些,0.7
  175. 有点,0.7
  176. 有点儿,0.7
  177. 有些,0.7
  178. 半点,0.5
  179. 不大,0.5
  180. 不丁点儿,0.5
  181. 不甚,0.5
  182. 不怎么,0.5
  183. 聊,0.5
  184. 没怎么,0.5
  185. 轻度,0.5
  186. 弱,0.5
  187. 丝毫,0.5
  188. 微,0.5
  189. 相对,0.5
  190. 不为过,1.6
  191. 超,1.6
  192. 超额,1.6
  193. 超外差,1.6
  194. 超微结构,1.6
  195. 超物质,1.6
  196. 出头,1.6
  197. 多,1.6
  198. 浮,1.6
  199. 过,1.6
  200. 过度,1.6
  201. 过分,1.6
  202. 过火,1.6
  203. 过劲,1.6
  204. 过了头,1.6
  205. 过猛,1.6
  206. 过热,1.6
  207. 过甚,1.6
  208. 过头,1.6
  209. 过于,1.6
  210. 过逾,1.6
  211. 何止,1.6
  212. 何啻,1.6
  213. 开外,1.6
  214. 苦,1.6
  215. 老,1.6
  216. 偏,1.6
  217. 强,1.6
  218. 溢,1.6
  219. 忒,1.6

1.4 停止词

停用词词典有很多,可以使用科院计算所中文自然语言处理开放平台发布了有1208个停用词的中文停用词表,也可以使用其他的停用词词表,但是要注意一下需要将否定词或者是程度副词的词典过滤掉,不然否定词在去除停用词的时候都过滤掉了,就缺少了一些程度副词或者否定词。如果需要过滤的话可以使用下面的方面过滤。

  1. #生成stopword生成,需要去除一些否定词和程度词
  2. stopwords = set()
  3. fr = codecs.open('data/中文停用词表.txt', 'r', 'utf-8')
  4. for word in fr:
  5. stopwords.add(word.strip())
  6. #否定词文件
  7. not_word_file = open('data/notDict.txt', 'r+', encoding='utf-8')
  8. # 由于否定词只有词,没有分值,使用list即可
  9. not_word_list = not_word_file.readlines()
  10. not_word_list = [w.strip() for w in not_word_list]
  11. #程度副词文件
  12. degree_file = open('data/degree.txt', 'r+', encoding='utf-8')
  13. degree_list = degree_file.readlines()
  14. degree_list = [d.split(",")[0] for d in degree_list]
  15. #生成新的停止词
  16. with open("data/stopwords.txt", "w") as f:
  17. for s in stopwords:
  18. if (s not in not_word_list) and (s not in degree_list):
  19. f.write(s+"\n")

2.数据预处理

2.1 jieba分词

直接使用jieba分词工具进行分词

2.2 去除停用词

在jieba分词之后过滤掉停用词

  1. def seg_word(sentence):
  2. """使用jieba对文档分词"""
  3. seg_list = jieba.cut(sentence)
  4. seg_result = []
  5. for w in seg_list:
  6. seg_result.append(w)
  7. # 读取停用词文件
  8. stopwords = set()
  9. fr = codecs.open('data/stopwords.txt', 'r', 'utf-8')
  10. for word in fr:
  11. stopwords.add(word.strip())
  12. fr.close()
  13. # 去除停用词
  14. return list(filter(lambda x: x not in stopwords, seg_result))

3 模型构建

3.1 找出文本中的情感词,否定词和程度副词

  1. def classify_words(word_dict):
  2. """词语分类,找出情感词、否定词、程度副词"""
  3. # 读取情感字典文件
  4. sen_file = open('BosonNLP_sentiment_score.txt', 'r+', encoding='utf-8')
  5. # 获取字典文件内容
  6. sen_list = sen_file.readlines()
  7. # 创建情感字典
  8. sen_dict = defaultdict()
  9. # 读取字典文件每一行内容,将其转换为字典对象,key为情感词,value为对应的分值
  10. for s in sen_list:
  11. # 每一行内容根据空格分割,索引0是情感词,索引1是情感分值(情感词典文件中有一行是空行,因此执行的时候会报错,注意处理一下空行,这里没有处理)
  12. sen_dict[s.split(' ')[0]] = s.split(' ')[1]
  13. # 读取否定词文件
  14. not_word_file = open('notDic.txt', 'r+', encoding='utf-8')
  15. # 由于否定词只有词,没有分值,使用list即可
  16. not_word_list = not_word_file.readlines()
  17. # 读取程度副词文件
  18. degree_file = open('degree.txt', 'r+', encoding='utf-8')
  19. degree_list = degree_file.readlines()
  20. degree_dic = defaultdict()
  21. # 程度副词与情感词处理方式一样,转为程度副词字典对象,key为程度副词,value为对应的程度值
  22. for d in degree_list:
  23. degree_dic[d.split(',')[0]] = d.split(',')[1]
  24. # 分类结果,词语的index作为key,词语的分值作为value,否定词分值设为-1
  25. sen_word = dict()
  26. not_word = dict()
  27. degree_word = dict()

3.2 计算分数

规则:分数采用情感词的分数和计算

遍历所有的情感词,查看当前情感词的前面是否有否定词和程度副词,如果没有否定词,就对当前情感词乘以1,如果有否定词或者有多个否定词,可以乘以(-1)^否定词的个数;如果有程度副词,就在当前情感词前面乘以程度副词的程度等级。

伪代码如下:

  1. finalSentiScore = (-1) ^ (num of notWords) * degreeNum * sentiScore
  2. finalScore = sum(finalSentiScore)
  1. def socre_sentiment(sen_word, not_word, degree_word, seg_result):
  2. """计算得分"""
  3. # 权重初始化为1
  4. W = 1
  5. score = 0
  6. # 情感词下标初始化
  7. sentiment_index = -1
  8. # 情感词的位置下标集合
  9. sentiment_index_list = list(sen_word.keys())
  10. # 遍历分词结果(遍历分词结果是为了定位两个情感词之间的程度副词和否定词)
  11. for i in range(0, len(seg_result)):
  12. # 如果是情感词(根据下标是否在情感词分类结果中判断)
  13. if i in sen_word.keys():
  14. # 权重*情感词得分
  15. score += W * float(sen_word[i])
  16. # 情感词下标加1,获取下一个情感词的位置
  17. sentiment_index += 1
  18. if sentiment_index < len(sentiment_index_list) - 1:
  19. # 判断当前的情感词与下一个情感词之间是否有程度副词或否定词
  20. for j in range(sentiment_index_list[sentiment_index], sentiment_index_list[sentiment_index + 1]):
  21. # 更新权重,如果有否定词,取反
  22. if j in not_word.keys():
  23. W *= -1
  24. elif j in degree_word.keys():
  25. # 更新权重,如果有程度副词,分值乘以程度副词的程度分值
  26. W *= float(degree_word[j])
  27. # 定位到下一个情感词
  28. if sentiment_index < len(sentiment_index_list) - 1:
  29. i = sentiment_index_list[sentiment_index + 1]
  30. return score

3.3 计算每句话的分数

  1. def setiment_score(sententce):
  2. # 1.对文档分词
  3. seg_list = seg_word(sententce)
  4. # 2.将分词结果列表转为dic,然后找出情感词、否定词、程度副词
  5. sen_word, not_word, degree_word = classify_words(list_to_dict(seg_list))
  6. # 3.计算得分
  7. score = socre_sentiment(sen_word, not_word, degree_word, seg_list)
  8. return score

3.4 计算整个新闻的情感值

这里对整个文本根据标点符号进行分割,然后求整个文本的平均值。

  1. def sem_analyses(content):
  2. pattern = r',|\.|/|;|\'|`|\[|\]|<|>|\?|:|"|\{|\}|\~|!|@|#|\$|%|\^|&|\(|\)|-|=|\_|\+|,|。|、|;|‘|’|【|】|·|!| |…|(|)'
  3. test_text = 'b,b.b/b;b\'b`b[b]b<b>b?b:b"b{b}b~b!b@b#b$b%b^b&b(b)b-b=b_b+b,b。b、b;b‘b’b【b】b·b!b b…b(b)b'
  4. result_list = re.split(pattern, content)
  5. scores = 0
  6. for text in result_list:
  7. score = setiment_score(text)
  8. scores += score
  9. print(scores/len(result_list))
  10. return scores/len(result_list)
  11. # print(result_list)
  12. content = "所长世界观政教分离才是伊拉克人民的美好未来方向,伊拉克没有共产党,不会有春天。伊拉克需要一个社会主义特色系统,宗教归宗教,宗教在心中,但人总不能用宗教治国吧。宗教是人的信仰,但治国是人类的发展方向,定好治国标准和信仰干涉治国的范围后,我相信伊拉克会有不一样未来,会非常美好。总之而言,伊拉克必须依法治国为主,依教为辅。"
  13. sem_analyses(content)

以上就是根据情感词对文本数据进行极性分析。

 

Reference:

https://blog.csdn.net/cjjwwss/article/details/79953397

https://blog.csdn.net/lom9357bye/article/details/79058946

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

闽ICP备14008679号