机器学习实战,使用朴素贝叶斯来做情感分析
前段时间更新了一系列基础的机器学习算法,感觉有些无味,而且恰好那时买了了国内某公司的云服务器,就打算部署一套文本处理的WEB API
,顺别应用一下之前学习到的机器学习算法。(文末放出地址)
本文不会涉及过于复杂的数学原理,主要讲述如何提取特征与调用模型。
实现了的api
- 分词
访问
/cut?sentence=&method=
,其中sentence
参数指明需要分词的句子,method
参数指明分词的方式。 - 统计词频
访问
/count?sentence=&=method=
,其中的参数说明和分词的api一致。 - 情感分析
访问
/count?sentence=
,因为目前是针对句子的,因此sentence
的范围限制了在1~200词之间。
本文重点讲述情感分析的实现。
情感分析的实现
情感分析的应用是多种多样的,往大了说,可以用于国家对某个热点进行舆情监控,选举的选情分析,电商对产品的售后意向调查,往小了说还可以写一个脚本对你女神的微博进行关心
,在女神不开心的时候及时送上关心。
至于情感分析的实现,在学术论文上均有提及,大致过程都可以分为提取情感极性词
,将语句转化为向量
,扔进你训练好的模型里
在这里我们针对实际情况做出一定的修改,提取情感极性词,必然是需要词典来参考的,虽然各大语言机构都有公开的词典,,但并不建议使用这些词典。其中一个原因是因为这些公开的词典太过书面化,和“礼貌”,不太接近日常生活。因此这这里我采用的是自定义词典,另外一点是,在提取关键词部分不仅仅是提取情感相关的词语,同时也使用其他日常用语,比如草泥马
,虽然不像开心
,伤心
这样的情感极性词,但草泥马
显然具有明确的情感偏向。
值得说明的是,我们既然在提取特征词的时候考虑到平常的词语,同样也就意味这一些乱七八糟的词语会混进来,所以我们在提取完特征词后,同时计算它们的词频,只取频率排名的前20%,(当然这个数字可以根据自己需要调整)。
挑选的出来的特征词就构成了[word1,word2,word3……]
,同时检测训练样本,若样本中出现了特征词,则该样本的特征向量对应位置置1,否则为0。
构成特征向量后,我选取的算法是朴素贝叶斯
,关于其原理,可以查看
分类算法之朴素贝叶斯分类(Naive Bayesian classification)
至于为什么选取朴素贝叶斯,很大一个原因是因为朴素贝叶斯
在垃圾邮件分类上有不错的效果,而确定一个句子属于那种情感,和判断一封邮件是否为垃圾邮件有异曲同工之妙。
在sklearn中,只要添加如下代码即可。
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb = gnb.fit(feature, label)
result = gnb.predice(test)
上述api中涉及的分词操作均是使用 结巴分词 完成。
测试效果
下面测试用例又黄又暴力,未成年观众在家长的陪同下观看。
开源代码
https://github.com/MashiMaroLjc/dudulu
- Leetcode-Easy 796. Rotate String
- 2017.10.23解题报告
- Leetcode-Easy 461.Hamming Distance
- 洛谷P1439 最长公共子序列(LCS问题)
- Leetcode-Easy 575. Distribute Candies
- 洛谷P2115 [USACO14MAR]破坏Sabotage
- 修改nw.js的exe文件使其请求管理员权限
- Leetcode-Easy 728. Self Dividing Numbers
- Leetcode-Easy 412. Fizz Buzz
- 洛谷P2678 跳石头
- 洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
- 洛谷P1908 逆序对(归并排序)
- 洛谷P1137 旅行计划
- 洛谷P1722 矩阵 II
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Confluence 如何查看页面树
- 聊聊claudb的pubsub command
- Nginx证书和Tomcat证书能相互转化吗,请看这里
- 你真的理解 Webpack?请回答下列问题
- docker浅入深出3
- 绘图代码|多组学数据可视化的高端玩法
- Java单元测试——Mock技术配置
- 简单的场景分析LinearLayout 源码
- 避免栽坑之掌握Jenkins工作原理
- 如何检测JavaScript中的死循环?
- vue插槽2.6.0+
- 聊聊claudb的transaction command
- Lombok 的作者,成功讨伐 IntelliJ IDEA!
- springboot2之优雅处理返回值
- 通过NVM管理Node.js多版本