跟着大神重写的KNN 文档归类小工具
·背景
在知道KNN之前,楼主有时候会粗糙地做一些分类模型的计算。在拜读了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393.html]的一些文章从中得到了一些启发,这些天突发奇想决定把N年前的分类模型按照KNN的思路重写,重新把大神的思路形象地再回溯一下,方便后人更加清晰的认识整个过程。很多时候,历史的进步来源于前辈们的传道、授业、解惑。既然大神给JAVA,不材这边就继续补充一个C++的,为陷在JAVA中的斗士们吹一曲老革命之歌。
·设计思路
像大多数的ML体系一下,向量和概率学几乎是整个ML体系的基础,但从历史经验的推断又是ML的命门,人类与机器之间的战争从未体质。文档分类工具的设计初衷是希望拿到的这边文章能够准确的归为某一类,大神是通过KNN把复旦的语料分个类。楼主这边就简单地把公司投诉内容也简单归个类。KNN的最早设计模型如下图所示:

如上面左所示,X在K的定义范围内(规则半径或规则图形内)与其周围邻居属性归类最多的一项,则归为某类。具体到与邻居的相似是如何计算的,则是采用最基本的向量空间算法,Cos夹角。而SVM则是利用两个向量至理想边界的最大距离来分类,所以对于向量的理解至关重要。很多人KNN很简单,但是越是简单的,要用好反而更难。

在得知了最基本的计算思路后,做文档分类就能迎刃而解。把用自然分词分类,把每一个文档设置成一个向量,把每个词汇出现概率增益作为向量的维度,这样每一个向量就有了自己的标尺。有了标尺之后,就可以回到了上面有图的理论部分。剩下的工作就是遍历计算夹角,如下图所示,一目了然吧。

·编码中的可能碰到问题
- 文档分词工具,按目前汉字系来说其实都差不多,看个人喜好,楼主喜欢用SCWS开源加自定义词汇,唯独在编译时会碰到const char*的警告问题,这个与会不同的编译器有关。有洁癖者,请变量前加const。
- 计算文档向量原始矩阵:原著中推荐使用了berkleyDB+MR,但是实际操作过程中,并没有原著中那么复杂,经过实践,64位下c++ String和Map,真的隐秘而强大。
- 从流行的角度,在真正分类时,可以推荐使用Spark,几乎完爆hadoop了,后续楼主会补充pyspark的代码。可惜了分词的时候不能发挥外部API的特色。
- 由于出于个人兴趣,未追求程序计算量的性能极限,有一些声明和全局的处理比较粗糙。有该癖好的者,请多用指针。
- 下面是代码和工具截图,方便期间仅做了.a文件。其中涉及到部分公司的商业数据,楼主做了敏感处理,请仅做学术之后。如派为他用,请自行接受法律制裁。
- 仅适用linux/centos kernel2.6


·测试的结果
把投诉内容按网络质量、终端销售、服务质量进行分类。如之前所述楼主把cos值做了直接相加,相加最大值为最相似判定。在测试样本的随机结果中命中还是OK的。当然,话说回来,任何ML算是的弊端还是"历史经验和人的因素。



跟着大神重写的KNN 文档归类小工具的更多相关文章
- 帮哥们做的一个整理文档的小工具(C++ string的标准函数还是很给力的,代码在最下)
其实把程序用到生活中,真的能节约不少时间!程序的力量是无穷滴! 哥们的毕业设计是要做法律文书匹配之类的东东,有一步是要抽取所有的法律法规名称,而刚好我们要处理的文件中,法规的名称之前都有个‘.‘,所以 ...
- phpmyadmin-您可能正在上传很大的文件,请参考文档来寻找解决方法
phpmyadmin-您可能正在上传很大的文件,请参考文档来寻找解决方法 实这个很简单的只要更改php.ini里三个配置即可.(见下面加粗部分,改成你自己的需求即可) ; Maximum allo ...
- springboot成神之——swagger文档自动生成工具
本文讲解如何在spring-boot中使用swagger文档自动生成工具 目录结构 说明 依赖 SwaggerConfig 开启api界面 JSR 303注释信息 Swagger核心注释 User T ...
- sphinx doc 文档生成脚手架工具
sphinx 在python 语言开发中,是一个使用的比较多文档生成脚手架工具,我们帮助我们生成 专业的帮助文档,同时也有远端的免费saas 托管服务,方便分发 安装 sphinx 的安装好多方便,m ...
- Docker相关环境全套安装文档兼小技能
Docker相关环境全套安装文档兼小技能 以下环境皆为ubuntu16.04,主要安装docker,docker-compose,docker仓库等. Docker安装 参考官方 A: 有源安装 Ub ...
- 基于 React 开发了一个 Markdown 文档站点生成工具
Create React Doc 是一个使用 React 的 markdown 文档站点生成工具.就像 create-react-app 一样,开发者可以使用 Create React Doc 来开发 ...
- RESTful API接口文档规范小坑
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...
- 听justjavac大神live前端的入门与进阶小笔记
代码规范 代码强壮,调试代码 少用变量,多用常量 少用for循环,why循环,多用函数式, 不要直接去使用框架 刷题 提高编程思维 用js去做c语音的问题 阅读别人代码,去看别人的代码 a+b> ...
- 干掉 Postman?测试接口直接生成API文档,这个工具贼好用
大家好,我是小富~ 前几天粉丝群有小伙伴问,有啥好用的API文档工具推荐,无意间发现了一款工具,这里马不停蹄的来给大家分享一下. ShowDoc一个非常适合团队的在线API文档工具,也支持用docke ...
随机推荐
- cocos2d-x 3.1.1 学习笔记[21]cocos2d-x 创建过程
文章出自于 http://blog.csdn.net/zhouyunxuan RootViewController.h #import <UIKit/UIKit.h> @interfac ...
- linuxc_螺纹锁紧pthread_mutex_t
在实际执行过程中的线程,我们经常需要同步多线程. 然后你可以使用互斥锁来完成任务:在使用过程中互斥锁,有pthread_mutex_init,pthread_mutex_destory,pthread ...
- 跨域请求jQuery的ajax jsonp使用常见问题解答
前天在项目中写了ajax jsonp的使用,出现了问题:能够成功获得请求结果,但没有运行success方法,直接运行了error方法提示错误--ajax jsonp之前并没实用过.对其的理解为跟普通的 ...
- 为什么在Python3.4.1里输入print 10000L或10000L失败
打开Python的命令行交互窗体,而且在里面进行以下的输入: Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:38:22) [MSC v.1600 ...
- Hadoop-2.2.0中国文献—— Web应用代理
Web应用代理是YARN的一部分. 默认地,它会作为 Resource Manager(RM)的一部分来执行, 可是也能够配置成独立执行的模式.使用代理的原因就是减少通过YARN的web攻击的可能性. ...
- Repository、IUnitOfWork和IDbContext
DDD 领域驱动设计-谈谈Repository.IUnitOfWork和IDbContext的实践 上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDb ...
- Windows Phone 独立存储资源管理器工具
如何使用独立存储资源管理器工具 http://msdn.microsoft.com/zh-CN/library/hh286408(v=vs.92)C:\Program Files (x86)\Micr ...
- SDUT OJ 2463 学校password你必须学会科学计划
#include<iostream> #include<string.h> #include<stdio.h> #define N 10010 #define M ...
- 移动端 (基于jquery的3个)touch插件
//第一个 Author: Alone Antroduction: 高级前端开发工程师 Sign: 人生没有失败,只有没到的成功. //依赖jQuery 或者Zepto <script> ...
- js 性能优化整理之 缓存变量
简单的常见的操作:假设每个便签添加一个 属性 -webkit-animation-delay:0.1s 递增操作::通过for循环添加 <ul id="uls"> ...