一、神箭手对这个问题的处理
先说说神箭手的情况吧,这个问题我们很久之前就开始研究了,一直期待能做到一个优秀的效果,就像友商@Jerry黄大仙 说的一样,新闻场景中的正文标题识别确实是相对好做的,可以直接hard coding一些特征。因为新闻标题在页面中出现的地方是很有特点的,比如在title标签中大概率出现,比如在正文上面大概率有h1,h2等标签,比如下面大概率有作者,发布时间等部分。显然可以看出,这个方案类似于特征工程师的工作,虽然看似原始,但事实上在大多数场景下是最快速的问题解决方案。目前在类似百度新闻搜索这样的采集场景是非常好用的,但是如果做全网爬虫依然面临两个问题:1.无法识别出来这个页面是不是文章页 2.有的非新闻的文章标题还是很不一样的。而且全靠人来做处理也存在一个天花板的问题,一个人能处理的信息是有限的,因此我们现在也逐步过渡到了深度学习的方案上去了,这个我在方案三具体来讲。
二、谷歌内部的处理
之前在谷歌工作时,center-piece组(不确定拼的对不对,老同事不要来拍砖)就坐我旁边。这个组专门分析页面中哪些重要的信息是我们关心的,哪些信息是我们不关心的(识别正文和标题)。大家可能以为谷歌的方案一定很高大上,然而事实并不是这样,谷歌内部对于Google Brain这样的高大上的解决方案的使用率并不高(可能是由于黑盒的原因),不过由于谷歌有大量的日志信息(像是搜索日志,还有chrome日志,不过这个高度敏感,一般团队申请不到)通过日志行为加上页面特征的做一些hard coding,再结合渲染js,这个大公司有钱做计算,可以对大量页面都做一次js渲染之后再处理。因此准确度会比我们自己来做hardcoding要好不少,当然我不是那个组的,具体方案我知道了估计也不能说,就瞎扯这么多吧。
三、diffbot方案
事实上diffbot算是这个领域做的最完善的一家公司了,神箭手也在参照的他们的方案在做。以前如果要使用神经网络来分析页面中标题是什么,正文是什么。大多采用的方案是将dom树特征和css特征手动提取出来,然后在扔到一个神经网络里去做BP训练,这样的好处是计算量小,坏处是依然需要特征工程,而且不够通用,经常会出现一些页面不符合要求的还得重做特征工程,跟方案一就没区别了(说不定还不如方案一)。
根据diffbot的公开信息,他们是以图像识别为主算法结合NLP等其他技术来做的元素类型识别。当然,他们不会告诉大家他们完整的算法,不过这里我做一个推测,也是目前神箭手的思路,拿出来跟大家分享,也欢迎大家私信来讨论。
首先对于图像方案,最重要的是渲染所有能渲染的部分,包括图片,CSS,AJAX等等,因此需要一个完整渲染,当然技术上很简单,通过无头浏览器就可以轻松实现。接着如何做呢,我们有如下选择:
1.不做整体渲染,而是对每一个dom元素进行渲染(可以通过一些特征先简单做一下筛选),然后扔进cnn直接做分类,简单粗暴。问题有两个:首先dom元素很多,导致要渲染很多次,没必要。其次一个元素是否是标题不仅仅是由他自己的样子决定的,还由他周边的元素样子决定。
2.做整体渲染,同时我们可以通过js获取到每个dom在整体图片中的位置(x,y,width,height)然后在整张图中截取类似(centorX,centorY,width*2,height*2)的这样一张图扔进CNN做分类,这样做解决了多次渲染和没有周边元素的问题,但是显然计算量可以说和1一样,是非常的大。
3.做整体识别,首先先把整张图做一次分类,判断是文章页,列表页,商品页还是什么。然后针对每种页面直接扔进cnn,输出一个对应类型所包含的所有元素的矩形框(一种类型的页面,包含的元素数量是固定的),比如文章页,就输出向量 {Pt(有title的概率),Xt,Yt,Wt,Ht,...} 根据向量里的元素和现有的dom元素进行一个位置对比,找出跟识别出来的位置最大重合的dom的元素,就认为是相应的元素。这个方案最大的问题,一方面训练分两步,导致所有样本首先要被分成不同类型,最终训练出来的model也有多个,导致实践中数据和算法很难处理,不是end to end。另一方面识别的时候也会比较慢。
4.将整张图的分类问题和输出boundingbox放在一次计算中,参考YOLO算法,首先训练的时候,先将标题,评论这些元素单独渲染并单独训练一个分类model,然后在整体将图片进行划分成多个cell,让每一个cell输出一个非背景元素的概率,一个boundingbox和分类向量,同时前几位用一个softmax输出网页类型的分类,这样虽然在训练的过程中会比较麻烦,但是在实际识别的时确实一个标准的endtoend的方案,速度会快很多。这个方案最大的问题就是像是作者,发布时间这类太小了,导致如果分隔的cell太大,容易识别不出来。cell太小,运算量又大,而且训练的更慢。
综上,单纯用图像算法,还是很难解决比如评论中的评论者头像这类问题,最终还是需要结合dom树以及文本特征做一些微观的处理,不过宏观上大块的分隔确实鲁棒性高了很多,也通用了很多。
目前神箭手正在完善相关的算法,以及训练数据的处理。不过爬虫确实可以方便的解决掉大部分的训练数据问题。后续我们也会推出类似diffbot的解析API。当然现在这个最大的问题还是太慢了,完整渲染一下网页估计就得花掉10s+。
作者:吴桐
链接:https://www.zhihu.com/question/268769681/answer/347073077