前情传送门 → 熊猫吃短信:全新的基于机器学习的垃圾短信过滤应用
在最近的几个版本迭代中,我新收集到了四万多条短信样本,并扩充到了熊猫的模型中。我个人很喜欢 ML 这种流程,只要不停的喂数据就好了,不用改一行代码,它就能变的更好……
产品角度的一点点分享
由于用户群扩大,在一条短信是不是垃圾短信上有了越来越多的分歧… 比如,有些人认为「送你一张优惠券」应该是正常短信,有些人认为要看优惠券面值和门槛来区分,我认为所有这种都是骚扰短信……
再比如理财类的短信,「 XX 基金推荐购入」,短信本身是否有价值,取决于是否是用户订阅的,发给 A 用户可能是有用的信息,发给 B 用户就是骚扰短信了。
我在中间一个版本中,花了很多天时间重新标注了几万条短信样本,从二值分类(正常和垃圾短信)改成了多值分类(正常、广告、不重要、公益等),试图解决一部分问题,但是多值分类会让机器学习的模型成倍增长,并且超过扩展的内存限制( iOS 短信扩展的内存限制非常低)后来经过多次尝试后我最终选择了降维后的三分类(正常、广告、不重要)模型( 200Kb 大小)。
用户的需求总是不同的,我尽可能的让熊猫的预测结果满足大部分的期望。虽然我很希望用 ML 来解决所有问题,但是目前还没有办法在手机上动态调整模型,就算可以,一个用户喂上十几条短信也是很难将熊猫吃了几万条短信形成的思维改过来的……
所以最终我还是加了号码、关键词黑、白名单的功能,让用户可以简单粗暴的自定自己的需求。对于常见的短信模式不建议加关键词来拦截,比如退订,你要相信熊猫有足够的智力分辨带「退订」的是不是垃圾短信…… 建议只对一些特有的情况加关键词,比如「 XX 手机报」「 XX 中学」等
技术角度的一点点小分享
起初我用 python 训练的模型,转换成 CoreML 后会有一点点结果不一样,因为分词算法不一样。由于把带词库的算法移植到 iOS 上很难(光是加载词库就超过 iOS 扩展的内存限制了,直接就会 OOM )所以我就反过来用 pyobjc 直接调用 CoreFoundation 的分词算法,保证训练和预测时分词一模一样。除了性能有点低外,效果还不错,就是这个分词算法有点笨(
顺便求个关注
全干的独立开发者一枚,靠卖 App 为生。会 Python、移动开发、前端,略懂设计。目前作品有 HyperApp、Ping、Cloud Speed、熊猫吃短信。
