朴素贝叶斯分类演示

April 18, 2013

点我传送

用了一个星期,弄了一个朴素贝叶斯分类的演示,记录一下选择。

文件格式

最初参考了Weka用的ARFF格式,因为我只处理离散值,而且Parser难写,类型难设计,所以做了很多简化。

文件解析

文件解析用了attoparsec和cassava,都是出于对性能的考虑。Hackage上有好几个CSV文件解析的库,只有cassava是用vector,所以就选了cassava。我想用流的方式解析文件,用Mutable vector记录数据,没成功,最后还是要把整个文件读到内存。文件解析的时候,各种类型的字符串转来转去,略麻烦,每次类型不对就转一转,我试过简化一下转换过程,也失败了,

Web框架

最初我是想用Yesod,因为以前有看过,感觉会比较容易。但是,一想到这个演示处了理静态文件,就只有两个页面,数据库什么的都不用,所以想换个轻量级的框架。那天刚好看了sunroof的一个教程,顺带发现了scotty,看了下API,感觉够用,就决定用scotty了。

模板

scotty不带模板,所以我用blaze-html作为模板。我先用html写一遍,花了不少时间学bootstrap。看起来还可以就转换成blaze-html。用blaze-html写真比html的方便很多,可以把重复部分抽取出来,感觉良好,不过要编译才能看结果,反馈时间要长一点。

数据处理

最初,我在服务器端计算出全部的先验和条件概率,然后在浏览器预测新实例的分类。这样扩展起来太麻烦,例如我要加入拉普拉斯平滑,因为我不在服务器端保存数据,所以要同时返回平滑的和没平滑的结果。现在服务器端只简单统计了一些信息,让浏览器端计算概率,公式显示也很容易就实现了(用了Mathjax)。

两个版本管理系统

我一开始就用Darcs管理代码,但是部署到OpenShift的时候用git,要经常复制文件,我想应该可以用cabal来实现,只是没时间看文档,所以还是写了个脚本来复制文件。

浏览器差异

只在Chromium 26、Firefox和某IE上测试过,显示略有差异,还是Chromium最好。