4、关系抽取技术:基于规则的关系抽取、基于深度学习的关系抽取、供应链特有关系的定义

关系抽取,说白了就是回答一个问题:两个实体之间到底什么关系?

比如「苹果公司」和「iPhone」之间,是「生产」关系。
「供应商A」和「物料B」之间,是「供应」关系。

我刚开始做供应链知识图谱的时候,觉得关系抽取不就是找动词嘛。后来发现,供应链里的关系远比你想象的要复杂。你想想看,一个「采购订单」和「供应商」之间,既有「下单」关系,又有「付款」关系,还有「物流」关系。光靠动词,根本搞不定。

这一章,我就把三种主流的关系抽取方法掰开揉碎了讲给你听。

4.1 基于规则的关系抽取

这是最传统的方法,也是我早期项目里最常用的方法。
它的核心思路很简单:写模板,匹配文本

比如,你看到这样的句子:

「华为向台积电采购了100万颗芯片」

我们可以写一条规则:

如果句子中出现「[实体A]向[实体B]采购了[数量][实体C]」
则抽取关系: (实体A, 采购, 实体B, 数量, 实体C)

嗯,这里要注意。规则抽取的优点是精准、可解释。你写一条规则,它就老老实实匹配一条,不会乱来。

但缺点也很明显:

  • 规则覆盖不全。同一个关系,可能有十几种表达方式。比如「采购」还可以说「下单」、「订购」、「买入」。
  • 维护成本高。我曾在项目中维护过300多条规则,每次新增一个供应商,就要加几条新规则。后来实在扛不住了。
  • 跨领域迁移差。电子行业的规则,拿到汽车供应链里,基本全废。
我的经验:规则抽取适合做冷启动。刚开始没有标注数据时,先写50-100条核心规则,快速跑通流程。等数据积累起来,再上深度学习。

4.2 基于深度学习的关系抽取

深度学习的方法,说白了就是让模型自己学「关系长什么样」。

目前主流的方法有两种:

4.2.1 基于预训练模型(BERT等)

把句子和实体位置一起输入BERT,让模型输出关系类别。

输入: 「[CLS] 华为 [SEP] 台积电 [SEP] 华为向台积电采购了100万颗芯片 [SEP]」
输出: 采购关系 (概率 0.97)

我建议你直接用现成的预训练模型,比如BERT-base-chinese,然后在自己的供应链数据上微调。效果通常比从头训练好得多。

4.2.2 基于远程监督

这个方法很有意思。它利用已有的知识图谱,自动标注文本数据。

比如,你的知识图谱里已经有:

(华为, 供应商, 台积电)

那么,任何同时出现「华为」和「台积电」的句子,都被自动标注为「供应商」关系。

这样做的好处是省人工。但坏处是噪声大。为什么?因为两个实体出现在同一句话里,不一定就是目标关系。比如「华为和台积电都是知名企业」,这句话里它们只是并列关系。

避坑指南:我曾经用远程监督标注了10万条数据,结果模型训练出来,准确率只有60%。后来发现,很多标注都是错的。所以,远程监督一定要配合去噪策略,比如多实例学习、注意力机制等。

4.3 供应链特有关系的定义

这是整个关系抽取里最核心的部分。
通用知识图谱的关系,比如「父子」、「位于」、「出生于」,在供应链里基本用不上。

供应链需要的是业务关系。我把它归纳为五大类:

关系类别 典型关系 示例
供应关系 供应、采购、代工、分销 (富士康, 代工, iPhone)
物流关系 运输、仓储、配送、报关 (顺丰, 运输, 华为仓库)
财务关系 付款、收款、账期、预付款 (华为, 付款, 台积电, 账期30天)
质量关系 质检、合格、退货、索赔 (质检部, 质检, 物料A, 结果合格)
合同关系 签约、续约、违约、终止 (华为, 签约, 台积电, 合同编号C001)

我个人习惯,在定义关系时,遵循三个原则:

  1. 粒度适中。不要分得太细,比如「采购」和「订购」可以合并为「采购关系」。太细了模型学不好。
  2. 业务可解释。每个关系都要有明确的业务含义。比如「账期30天」这个属性,财务部门一看就懂。
  3. 可扩展。预留一些自定义关系字段,方便后续业务调整。
核心观点:供应链关系抽取,技术只是手段,业务理解才是灵魂。你定义的关系,必须能回答业务问题。比如「这个物料有几个供应商?」、「这批货的物流状态是什么?」。如果关系定义得不对,再好的模型也是白搭。

4.4 知识体系结构图

下面这张图,把本章的核心逻辑串起来了。你可以看到,关系抽取从规则到深度学习,再到业务定义,是一个层层递进的过程。

关系抽取技术知识体系 基于规则 基于深度学习 供应链特有定义 模板匹配 正则表达式 语法规则 BERT微调 远程监督 多实例学习 供应/物流/财务 质量/合同关系 业务可解释性 供应链知识图谱

你看,从规则到深度学习,再到业务定义,这三者不是互斥的。我现在的做法是:规则兜底,深度学习提效,业务定义定方向。三者结合,才能构建出真正可用的供应链知识图谱。

一个小建议:刚开始做关系抽取时,别追求完美。先定义10-20个核心关系,用规则跑通。等业务验证了价值,再逐步扩展。我见过太多团队,一上来就想把所有关系都抽出来,结果半年过去了,还在标注数据。

公众号:蓝海资料掘金营,微信deep3321