Published

一 24 十二月 2012

←Home

BBS主题正文内容抽取

公司的业务需要从互联网中获取大量的新闻,博客,论坛,微博等文本进行分类,后续会进行个性化的广告投放。

这其中我将其做个分类,三种类型:

  1. 新闻、博客主要是集中一大块文本,相对来说有现成的文本提取算法可以实现(我们也维护了一个庞大的正则或xpath库,匹配大量站点做兼容);

  2. 微博,因为是单一网站,可以通过接口或者模拟请求,也能够通过固定的正则,xpath等进行文本提取;

  3. 论坛,不太一样的是可能会有多块的文本,楼主的帖子也不一定是正文最长,甚至有可能发帖在二楼,针对新闻的文本提取算法不适用于论坛。

当然,有的人还会说,论坛的场景还有各样,还是看需求,我们认为主题一定是在楼主,且后面的歪楼不算等,针对舆情或者广告类,不需要100%精确,量大配概率来实施。

这里简单说下BBS内容提取算法流程介绍(支撑公司上百网站的抓取)

1 规范整理html(preTreatment_html)

去除无用的结点(style,script,font,em等不影响结构的结点),这里使用tidylib进行的规整。

2 生成DOM树(soupparser.fromstring())

用BeautifulSoup。

3 遍历DOM树并找出相似结点(getSimilarNode)

一般网页分块都是用div,table,所以遍历的时候只遍历这类结点,比较相似结点用到

的方法:

① equalNode

比较结点属性及属性值是否相同,但href,style等不作比较,同时某些结点做相似度比

较,相关方法有similarity

② equalNodelayer

深入层数的比较,layer默认为3层,即取当前结点的第一个子结点作为一层。

4 去噪(getNodeText)

对取出的结点list做如下操作:

a 整理结点,标记图片位置,将img结点替换内容为对应图片链接。

b 将不包含文本内容的结点去除。

c 将共有的父节点去除(这里做下简单的判断,当子节点含有的文本内容占它父节点含有的文本内容百分比大于0.6时才执行此项操作)。

d 制定一些通用的规则,剔除多余的内容进行文本筛选。比如一般内容都包含有中文标点符号,judgecomma判断,仅为一个图片url的判断singleImg(因为可能为头像url或者广告url等等,一个难以判别,直接剔除),还有一些是很大可能不属于正文内容但却是论坛独有内容的剔除,比如含有“注册时间”,“距离下一级还需”,“当前在线”,“当前离线”,“发帖”,“积分”等等,组合这些关键字来判别剔除。

5 筛选后的主要内容确定(getIntro)

经过上面一系列的过滤后,textlist里的内容已不多,里面应该包含所需要取的,所以再做最后的处理。

判断textlist的长度:

①如果为0 , 则使用新闻类页面抽取的算法来处理。

②如果为1 , 则直接取当前的这一个文本作为最终结果。

③如果为2及以上,则对它们进行比较。一般取当中的3-4份文本,这里选择的参数是0.6,将每个文本与最长的文本相比得到百分比,如果超过当前设定的参数,则取它作为最终结果,否则取最长的文本内容作为最终结果。

注意点与不足: ⑴ 无回贴或者仅有一两个回帖的主题可能正确率会降低。

⑵ 对于仅包含视频或者主题内容过少(仅有几个字)的帖子不适用。

Go Top
comments powered by Disqus