【文智背后的奥秘】系列篇——结构化抽取平台

版权声明:本文由文智原创文章,转载请注明出处: 
文章原文链接:https://www.qcloud.com/community/article/91

来源:腾云阁 https://www.qcloud.com/community

随着大数据时代的到来,一个大规模生成、分享、处理以及应用数据的时代正在开启。如果能将互联网上异源异构的非结构化或半结构化数据转换为更易处理的结构化数据,可以极大的降低获取数据的门槛,为信息检索和数据挖掘提供基础,更好的挖掘数据中蕴藏的价值。

单纯考虑网页这种半结构化数据的抽取:对于搜索引擎一般需要抽取出页面的标题、实际标题、时间、正文等关键信息;而对于去哪儿、携程这种酒店预定网站则需要进行更精细化的信息抽取,需要抽取出酒店名称、地址、电话、价格、评分、简介等具体属性。

可以看到,大量互联网产品都依赖抽取功能,因此迫切需要一个方便、便捷、高效且准确的网页抽取平台。

一.常用抽取方法

目前针对html这种半结构化的页面,业界比较流行的抽取方法大致就两类:dom树分块以及模版抽取。

1.dom树分块

该方法的基本思想就是对html页面建dom树后,对dom树进行遍历,同时根据事先训练好的分类模型判断遍历到的容器节点的语义块类别,本质上就是分类问题。比如对新闻网页,一般定义的语义块类别有标题、实际标题、时间、正文、相关推荐、相关阅读、版权、广告等。如果用分类模型进行语义块判断,需要用事先标注好的样本进行训练。采用的特征集合包括该节点下的文本长度、特定关键词命中情况、标点符号个数、图片个数、标签宽度、各种html标签的分布情况等等。

通过模型预测节点的语义块类别会有几个候选,整体上会得到若干语义块组合序列,最后可以再用语言模型的思路得到一个最优序列。

该方法的优点是通用性强,主要工作包括定义新类别页面的语义块类别、样本标注、训练模型、抽取程序,一般用于大规模网页的处理;缺点是一般抽取到的语义块比较粗,精度不高。另外样本标注也需要大量的人力成本和时间成本。

2.模版类

针对下面这个页面

图2.1 豆瓣电影详情页

我们希望抽取导演、编剧、主演、类型、语言、上映日期等字段的信息, dom树分块的方法就不太适用了。因为这块区域整体上属于一个容器节点,子节点的特征方面区分度也不大。
因此有了第二类抽取方法:模版类抽取。该方法的基本思想很简单:事先配置好需要抽取内容的模版,模版可以是正则表达式或XPATH, 然后基于html进行精确的模版匹配,将匹配结果输出。该方法的优点是可以实现精细化抽取,缺点是模版的配置和维护成本较高。如正则抽取比较依赖页面中的wording,把wording作为桩,提取出桩周围的有用信息,因此对配置人员的正则能力要求比较高。

精细化抽取现在业界采用比较多的是XPATH,XPATH作为XML文档路径标准语言,通过路径表达式来定位与查找XML文档中的节点。使用XPATH进行精细化抽取的优点有:
(1)很多主流的浏览器都提供获取指定节点XPATH路径的功能,或者可以通过嵌入的JavaScript代码从DOM中获取XPATH路径,因此易于实现可视化配置,降低配置门槛。
(2)XPATH依赖页面DOM结构。而实际上一个网站或者一个子域下的页面结构确实大体一样,或者基本可以穷举,因此配置一组XPATH往往可以覆盖一个子域甚至一个站点下的页面。
(3)作为XML标准集下的一个重要标准,XPATH被广大厂商接受并推广,已经有很多开源且成熟的实现,因此更易得到社区的广泛支持。

本篇重点介绍我们在XPATH模版抽取方面做的工作,包括如何使配置简单化、如何对抽取的结果进行去噪、如何维护模版的更新、如何快速接入抽取等等;

在开始介绍抽取平台之前,先看看刚才那个豆瓣页面我们的抽取效果:


图2.2 豆瓣电影详情页抽取结果

二.平台的整体框架及介绍

系统分为配置管理、XPATH抽取以及去噪处理三个主要模块:
(1) 配置管理:负责配置的管理、更新与分发。
(2) XPATH抽取:根据配置的XPATH抽取页面中指定的属性。
(3)去噪处理:对抽取的结果做去噪处理。


图3.1 抽取平台整体框图

1.XPATH配置

为了降低配置门槛,做到人人可配、人人会配,因此在设计和实现模板配置的UI和交互的过程尽量做到简洁明了、轻量级、引导式交互、及时响应等原则。


图3.2 XPATH配置页面

2.抽取过程

整个抽取过程比较简单,因此直接使用流程图来说明抽取过程。


图3.3 XPATH抽取流程

3.去噪处理

虽然XPATH的抽取能精确到元素粒度,但很多时候仍然有大量的噪音存在。为此,我们提供了四个方面的噪音过滤规则:
(1)文本规则:通过配置正则表达式将属性值中的噪音去除。
(2)URL规则:针对链接元素,通过配置URL规则,将href属性不满足URL规则的节点过滤掉。
(3)元素属性规则:通过配置标签的属性规则进行噪音过滤。
(4)html规则:通过配置起始串与结束串,将html中以起始串开始,以结束串终止的子串过滤掉。


图3.4 噪音过滤规则配置页面

4.List元素抽取

在实现的过程中,发现有一类属性的属性值是一个List,List内元素之间是并列的。比如专辑《吻别》页面中,名称、歌手、发行时间等字段属于普通属性,但专辑下的曲目则属于List类型的属性。


图3.5 百度音乐专辑页

List元素XPATH有以下特点:拥有一个相同的祖先节点,从该祖先节点开始节点名称、层次以及深度都完全相同,并且在某个或某几个层级上是平行关系(偏移不一样)。上述专辑页中任意两首歌曲的XPATH即满足该特点:
《恋爱的人都一样》:/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[8]/div/span[5]/a
《拥抱阳光》:/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[9]/div/span[5]/a

根据这一特征,为了更好的表达和抽取这类属性值,我们将上面歌曲属性的XPATH虚化为:
/html/body/div[4]/div/div/div[4]/div/div[1]/div[2]/div[2]/div/ul/li[%d]/div/span[5]/a
其中%d作为占位符,抽取匹配的时候会具体化为实际的数字。

List属性的抽取流程为:

图3.6 List属性抽取流程

5.抽取指标及运营工具

平台经过近一年的持续迭代和运营,各项指标趋于稳定;平台的稳定性和可靠性得到验证;运营工具趋于完备,监控告警也基本做到全方位无死角。下面从三个方面来说明:
(1)运营指标:各项指标都在稳步上升,数据质量也在持续提高。数据在Qzone资讯推荐、QQ音乐搜索以及部门内数据挖掘类需求中得到应用,数据质量经受住了业务的考验。
最近两周系统主要运营指标如下,可以看到各项指标稳中有升,系统的运营状况良好。

日期 站点数 URL模板数 XPATH模板数 网页数 抽取成功数 成功率
2014-10-23 179 1159 2914 57,345,499 52,545,262 91.63%
2014-10-27 183 1168 293158,736,758 53,096,224 90.40%
2014-11-03 203 1295 3069 68,272,962 62,444,849 91.46%

表3.1 平台运营指标

(2)运营工具:提供了下载诊断与查询、快照查询、抽取检查、标准集验证、模板评测、抽样验证、抽取诊断等一系列的运营诊断工具。从配置、下载、快照、抽取到最终数据等环节都力争做到可运营。
(3)监控告警:结合一年以来暴露的运营问题,不断丰富对抽取各项指标的监控,提高系统的可用性和可靠性。目前主要告警有整体抽取失败报警以及模板抽取成功率跌幅超过阈值报警。

三.暗网数据抽取

通过上面的XPATH抽取平台,我们已经具备将互联网上大部分网页转换为结构化数据的能力。但是对于互联网上存在的“暗网”数据,由于其自身的特殊性,需要专门设计和优化我们的下载和抽取系统,下面主要介绍我们在这方面的思考和解决方案。

1.暗网的形成

WEB2.0时代,随着用户对WEB应用的体验要求越来越高,大量相关技术应运而生,特别是AJAX技术的兴起,使得WEB应用的用户体验接近客户端类的体验,因此被业界广泛采用。这类应用的架构大体是这样的:


图4.1 AJAX请求流程

这类富WEB应用对于用户来说比较友好,却对信息检索提出了考验。现今的搜索引擎爬虫大部分还是基于页面之间的链接关系,但对于这种无法通过超链接扩散以及抓取的动态网页,则无法被搜索引擎收录, 因此形成所谓的“暗网”。

另外,随着移动互联网的兴起,信息出现了多元化、异构化及碎片化的趋势。大量数据从WEB端向移动端转移,甚至有很多数据就是为移动端而生的。这类数据的典型特点是,通过常规的页面链接无法获取,形成一个一个的信息孤岛。为了解决数据获取问题,业界主要从下面两个方面入手:
(1)开发更强大的爬虫系统,以应对信息的孤岛化。从相关新闻可以看到:百度针对搜索引擎的升级和更新中,很大一部分与解决“暗网”问题有关。
(2)与“暗网”网站合作,数据厂商通过平台方开发的API提交结构化的数据,来达到信息的互联互通。像google前不久推出的应用内搜索,就是通过这种方式试图打破信息壁垒。

2.难点及解决方案

通过大量的案例分析,发现存在两个方面的问题:
(1)下载扩散
对于常见的网页,我们可以通过页面之间自然的链接关系被爬虫抓取,但是这类暗网页面往往无法通过正常的链接关系获取,接口之间是独立的。因此要扩散到这类动态接口,必须通过特殊的规则生成它们。这里我们归纳并抽象了一类特殊的模板类型:链接工厂模板,该模板是专门用来生产URL的。根据URL中可变的参数,在类型下我们会预定义n个属性参数。然后通过定义一个URL拼接规则,将链接工厂类页面中抽取出来的属性填充到URL拼接规则中,生成最终的数据接口URL。整个URL生成流程如下:


图4.2 URL生成与扩散流程

(2)抽取
我们的抽取平台是基于XPATH的, 因此对于接口数据格式为XML的异步HTTP请求,我们只要通过上面的方法生成并下载便能进行抽取。但在富WEB应用中JSON已经成为广泛采用的数据格式,为了接入上面的抽取框架, 这里我们采用的是将JSON数据转换成XML格式的方法,然后使用XPATH进行抽取。

图4.3 JSON数据抽取

可以看到,上述对暗网页面的下载与抽取比较好的适配在原有框架里,仅仅增加了一种链接工厂模板用于链接扩散,以及在抽取环节增加了一个数据类型转换的适配器模块。

3、暗网抽取案例分析

在Qzone资讯推荐项目开发及运营的的过程中,发现今日头条新闻列表页都是采用AJAX的方式加载的,通过抓包以及分析源码发现,今日头条推荐频道的数据接口地址为:
http://www.toutiao.com/api/article/recent/?category=__all__&count=100&max_behot_time=(time_stamp).00&offset=0&utm_source=toutiao


图4.4 今日头条推荐频道异步HTTP请求


图4.5 今日头条发起异步HTTP请求的JS代码

该接口是JSON格式的接口,而新闻详情页的URL为JSON中的一个字段,如图所示:


图4.6 今日头条JSON数据字段详情

我们将JSON转换为XML文档,转换后的结果为:


图4.7 转换为XML的今日头条接口数据

标红的部分即为新闻详情页的URL,可以通过正常的XPATH抽取出来,然后将该URL推给下载系统下载。通过这种特殊的扩散方法,今日头条的新闻才得以被下载系统下载,进而通过XPATH进行抽取。

四.未来展望

未来希望在以下几个方面进行改进和优化,使得结构化抽取平台越来越完善。

  1. 平台配置的简易性:后续会在XPATH配置管理上持续优化,提高平台的易用性,进一步降低配置门槛和学习成本。
  2. 抽取任务接入更加方便快捷,降低接入所需的沟通成本和开发成本,实现自动化和通用化。
  3. 支持更多的数据输出格式:目前是输出基于protobuf协议的sstable、recordio格式的文件,未来会支持更多的数据格式。

同时欢迎有需求的团队联系我们,使用腾讯文智自然语言处理

时间: 2024-12-14 05:16:54

【文智背后的奥秘】系列篇——结构化抽取平台的相关文章

【文智背后的奥秘】系列篇——情感分类

版权声明:本文由文智原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/92 来源:腾云阁 https://www.qcloud.com/community 情感分类是对带有感情色彩的主观性文本进行分析.推理的过程,即分析对说话人的态度,倾向正面,还是反面.它与传统的文本主题分类又不相同,传统主题分类是分析文本讨论的客观内容,而情感分类是要从文本中得到它是否支持某种观点的信息.比如,"日媒:认为歼-31能够抗衡F-35,这种

ElasticSearch常用结构化搜索

最近,需要用到ES的一些常用的结构化搜索命令,因此,看了一些官方的文档,学习了一下.结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的. 它们都有精确的格式,我们可以对这些数据进行逻辑操作,比较常见的操作包括比较时间区间,或者获取两个数字间的较大值. 精确查询 当进行精确查询时,过滤器filter是十分重要的,因为它们效率非常高,过滤器不计算相关性(直接跳过了整个记分阶段)而且很容易进行缓存. 过滤数字 我们首先看 term filter,它最常用,可以用来处理数字,布

如何用 AI 实现视频结构化管理?

继图片之后,视频结构化成为了深度学习领域又一个热点.相比图片,视频内容无疑具有更大的复杂性.面对不同场景的视频结构化需求,需要采用什么策略才能取得最大化的效果? AI 视频结构化对于互联网.广电等行业的变革又有什么样的价值? 在 4 月 20 日 QCon 全球软件开发大会上,七牛云人工智能实验室首席架构师姚唐仁分享了在深度学习视频结构化的实践经验. 1. 人工视频摘要与 AI 视频结构化的优势 根据哈佛商学院的研究,视觉是人获取信息最主要的方式,占全部感官的 83%.因为通过图片和视频的载体,

Swift入门篇-结构体

前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中是灰常重要的一部分,如果您很好的掌握结构体,在后面ios开发中,会理解的更加清楚. 一:结构体声明 格式: struct 结构体名 { } 说明: 1: struct 是定义结构体的关键字 例子 /* 1:struct 是结构体的关键字 2:student 结构体名称 3:student() 创建一

Elasticsearch系列---结构化搜索

概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外,没有那种相似的概念. 前言 结构化搜索将会有大量的搜索实例,我们将"音乐APP"作为主要的案例背景,去开发一些跟音乐APP相关的搜索或数据分析,有助力于我们理解实战的目标,顺带巩固一下学习的知识. 我们将一首歌需要的字段暂定为: | name | code | type | remark

sharepoint 2016 学习系列篇(15)-自定义列表应用篇-(4)数据权限配置

当数据已经录入到列表中之后,接下来,朋友们可能会想知道,有些数据,只想给某些用户看到,或者编辑,列表是否支持这样的操作. 大微软的sharepoint平台,对于用户的需求,可以说是考虑得很周全的,权限管理,当然也是不可能漏掉的,而且权限管理,还是sharepoint上一个非常突出的亮点,数据安全性管理的颗粒度,很完善.接下来,我们来看下,如何在sharepoint的自定义列表中,给数据配置不同的用户访问权限,这些当然也是不需要开发,就能实现的. 前面讲到,用户访问sharepoint平台网站的时

结构化异常处理系列

最近在项目中看到了许多自定义异常类,就想把它搞明白. 想知道为什么要这样处理?这样处理的优点是什么?自己怎么常见自己需要的自定义异常类? C#结构化异常处理是将程序中出现的错误的名称.消息和其他有用的信息都打进一个定义明确的包内. 构建一个强类型的自定义异常,这样在程序中对异常处理时就可以根据不同问题具有针对性的使用异常类,这样使用起来也更加明了,一看到就知道这里处理的是什么异常,一目了然. 下面就将学习笔记放在这里,希望大家多多指点: 结构化异常处理(一)概述 结构化异常处理(二)配置异常的状

怒学Python——第三篇——结构控制

众所周知,程序语句运行的结构无非是顺序结构.分支结构和循环结构,Python也是如此,顺序结构过于简单不提,简单记录一下分支和循环与C++的异同点,顺便提一下,对于已经会C++的人来说,学Python应该注意的是语句块通过缩进来控制. 分支结构:都使用if.else,多出了一个elif代替C++的else if,本质相同,就不给出例子 循环结构:和C++对比,没有了do..until语句,有while和for,里面同样使用break来结束循环,使用continue来进入下一个循环,但for出现了

Hulu机器学习问题与解答系列 | 二十二:特征工程—结构化数据

听说最近冒出的大批呱儿子个个都是撑着眼皮也要看书的无眠小青蛙.我们学习Machine Learning的脚步又怎能停下来?动动手指,上滑开始~ 今天的内容是 [特征工程-结构化数据] 场景描述 特征工程是指结合问题寻找有效的特征并进行处理成适合模型的输入形式.机器学习中有句经典的话叫做"Garbage in, garbage out",意思是如果输入的数据是垃圾,那么得到的结果也是垃圾.可以看出模型成败的关键并不仅仅取决于模型的选取,还取决于我们是否有根据特定的问题找到了行之有效的输入