利用序列模型实现 HTML 信息抽取

正午 2020-02-17 AM 234℃ 0条

爬虫从互联网获取的数据是非结构化的, 信息抽取会成为很多重要的环节。
我要抽取的是从各种不同的网站获取的 HTML 中的中标信息,HTML 来自成千上万的网站,下面是两个例子截图,红色部分为需要抽取的内容。要抽取的内容是第一中标公司,第一中标公司的联系人和对应中标金额共三个字段。可以看到这和通用的实体抽取还有些区别,有点儿角色标注的意思。

第一个想到的是用实体识别的方法,但是 HTML 是有结构信息的,简单的扔掉 HTML 标签从纯文本中抽取,将导致很多信息的丢失,比如表格信息,“第一中标人”这个表头,很可能就和对应的公司在纯文本中相距甚远,导致最终很难到一个比较好的效果。

另一个想法是利用 HMTL 结构构造一棵树, 用图模型抽取特征,对节点分类,但是这样好像又太麻烦,主要对图模型还不够熟悉。

能不能构造根据 HTML 结构人为的构造一个上下文然后利用实体识别的方法来抽取?

我设计了下面几个规则:

 1. 对整个 HTML  中的文本做实体抽取包括公司名、人名和金额的抽取
 2. 第一步抽取的实体如果在一个 table 标签中,则将表头中对应的内容,拼接在当前节点的前面,然后当前行的所有单元格合并成一行
 3. 如果第一步抽取的不在 table 标签中,则在当前实体所在标签的内容拼接上左右兄弟节点或父亲节点的内容组成上下文

比如下面例子1的第一行组成的上下文就会是用 "|" 分割不同单元格的内容: "中标候选人名称| 第一名:江苏云阳集团有限公司|第二名:江苏广新集团有限公司|第三名:江苏福地建设集团有限公司". 同样第二行组成的上下文就是对应金额的,在这样的上下文上面做序列标注就能很轻松的识别第一中标候选人,而不会把第二中标人识别冲第一中标人。

例1:

屏幕快照 2020-02-17 上午10.53.16.png

例2:

屏幕快照 2020-02-17 上午10.53.34.png

最后利用 bert 的预训练模型,做实体抽取,最终的效果还算不错的;
WechatIMG659.jpeg

标签: none

非特殊说明,本博所有文章均为博主原创。

评论