为了应付人工智能大作业,做了一个简单的垃圾邮件过滤工具,后来找到现成的语料(自己能找上千封分好类的邮件作为资料再慢慢一封封解析不太容易,我又不是搞人工智能的),所以最后一共也就写了300行代码。
处理好的语料的包含类别信息+54个特征词在邮件中的出现情况,一共4000多封的内容信息。
邮件用多变量贝努力事件模型表示,说白了就是忽视单词的频率,每个词在该邮件的情况,出现过置1,没出现置0,相对于考虑频率的各种模型和方法,这样算是大大简化了,但是资料说,其实这样的效果也差不了多少,在小规模数据甚至更好。
很多论文中是以信息增益作为特征选择排序的计算方法,计算公式也不复杂,至于我使用的spambase(http://www.ics.uci.edu/~mlearn/MLRepository.html)语料就不知道它是咋算的了,但是里面给出的54个关键词倒是有点奇怪,一些常用词没有,估计是做了一定优化处理,从关键词感觉垃圾邮件大多是推销商品的那种,可能我的工具代表性、推广性一般般,最后用这么简单的方法,得到的过滤效率居然高于百分之90,也没经过任何优化,还是有点意外的,不知道换一种语料情况如何。
至于其他细节也懒得记了,好久没写过Java,还是赶紧学起Java,主要记一些敲代码碰到的小问题吧。
1.上来用JDBC连数据库,告诉我Driver的类查不到,以前用数据库好像没印象要下个专门的mysql-jdbc-connection包,反正下了个导进去也就好了
2.通过sql语句查询得到的结果集ResultSet,单个循环取值没问题,用同一个Statement查询得到2个ResultSet并交替取值,报错说结果集关闭了,不能用一个Statement交替操作两个,后来多声明一个Statement也就行了
3.读取一行文件时,最后可能多一个换行符
4.两个整数相除时会自动将小数点后阶段,并返回整数,所以计算30/1700一直给我得到0,哪怕你用浮点数赋值也没用,先返回int,再帮你转成double,所以必须将两整数其一或是两者都强制转换为浮点数,或者这样在右侧强转float r1=(float)wrongNormal/normalNum;