这篇是工作之中的总结,因此写的不是很详细,写来下备注一下。 在爬虫下载的数据中,有相当数量的网页是垃圾网页,此类网页一般为提示信息或者填写信息等,因此需要识别出来。
1、特征选择
选择网页结构特征和语义特征相结合的方法,这个方法比用单一的网页结构或者语义分析效果要好。
网页结构特征:网页大小、网页标题、网页文本长度、网页锚文本长度、网页链接数量、网页图片数量、网页输入框数量
语义特征:分词后的特征词,进行了语义的和特征选择处理。
2、方法选择
刚开始用SVM方法,效果还可以,但是有两个问题:
1)训练集的不平衡问题,刚开始训练集中收集的垃圾页较多,正常页较少,导致训练出来的模型召回率高、准确率低。我分析原因是因为正常页少,分类函数偏向于垃圾页,导致准确率偏低。后来调整了训练集中垃圾页的比例(解决数据集不平衡的问题还有别的办法)。
2)网页结构和语义特征不是同等重要的,语义特征有几万个,而网页结构特征只有不到10个,每个网页语义特征远大于网页结构特征,这样会导致网页结构特征淹没在语义特征之中。
SVM方法的介绍,见:基于libsvm的中文文本分类
因为这两个问题,后来改为用贝叶斯(Bayes)方法。
Bayes方法可以参考如下资源:
数学之美番外篇:平凡而神奇的贝叶斯方法
算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
基于朴素贝叶斯分类器的文本分类算法
贝叶斯反垃圾邮件技术
3、贝叶斯理论
所以,要计算文档W在Cj的概率,计算W中的每个特征w1,w2..wn的在Cj下的概率,然后乘起来即可。
3、处理流程
选择一些样本数据,然后用工具进行标注,主要是把垃圾页标识出来,然后提取特征和预测。对于未识别的页面,可以把垃圾页特征加入规则库中,用规则过滤。
4、训练过程
网页结构特征的概率计算,为了避免过于分散,可以分段处理。比如网页长度,可以分为10段,分别用PL_0,PL_1…PL_9代替,假设网页长度最大是100k,则每段10k,将所有的垃圾页分布到每段中,统计每段的数量。假如垃圾页是C1,垃圾页数量为SpamCount,PL_0的数量为Spam0,则P(PL_0|C1) = Spam0/SpamCount,分别计算网页结构每个特征的每段的垃圾概率和非垃圾概率。
网页语义特征的提取。语义特征需要去掉低频词、高频词、无区分度的词。
低频词:很好理解,如果词在网页中出现次数太少(比如<5次),则去掉。
高频词:如果词在整个页面中出现过多(比如>20%),则去掉。
无区分度:如果P(Cj|Wi)大于0.4小于0.6,则是无区分度的词,也就是说某个词对于垃圾和非垃圾中概率都是很接近的,这类词可有可无。
类别区分度词的语义处理,通用的分词组件不能很好的处理分类中的类别区分词,比如“无数据”,分词组件一般会分为“无”和“数据”,“无”和“数据”都是类别区分度很小的词,在垃圾和非垃圾中的概率都在50%上下,但是“无数据”则是具有强区分度的词,因为垃圾页中的提示语中包含“无数据”的概率是很大的,在垃圾中的概率在90%以上,因此,要把分词组件分的过短的词组合起来,特别是否定词,“无”、“没”、“不”、“未”等需要合并。
训练过程就是统计垃圾中某个特征的概率和非垃圾中某个特征的概率。
5、预测过程
预测过程很简单,网页特征集合W(s1,s2…s8,w1,w2,…wn),s是网页结构特征,w是语义特征,分别获取每个特征的垃圾和非垃圾的概率,乘起来。
P(C1|W) = P(C1)P(C1|s1)P(C1|s2)….P(C1|wn)
P(C2|W)= P(C2)P(C2|s1)P(C2|s2)….P(C2|wn)
Prob = P(C1|W) / ( P(C1|W) + P(C2|W) )
如果Prob > 0.5则为垃圾,否则为非垃圾,最后效果。
所有数据 28178
所有识别正确 27463
识别为垃圾页 4991
实际垃圾页 5054
垃圾页识别正确 4665
正确率 0.974626 = 27463/28178
准确率 0.934682 = 4665 / 4991
召回率 0.923031 = 4665 / 5054
F 0.928820 = 2 * 准确率 *召回率 / (准确率 + 召回率 )