4、关系抽取技术:基于规则的关系抽取、基于深度学习的关系抽取、供应链特有关系的定义
关系抽取,说白了就是回答一个问题:两个实体之间到底什么关系?
比如「苹果公司」和「iPhone」之间,是「生产」关系。
「供应商A」和「物料B」之间,是「供应」关系。
我刚开始做供应链知识图谱的时候,觉得关系抽取不就是找动词嘛。后来发现,供应链里的关系远比你想象的要复杂。你想想看,一个「采购订单」和「供应商」之间,既有「下单」关系,又有「付款」关系,还有「物流」关系。光靠动词,根本搞不定。
这一章,我就把三种主流的关系抽取方法掰开揉碎了讲给你听。
4.1 基于规则的关系抽取
这是最传统的方法,也是我早期项目里最常用的方法。
它的核心思路很简单:写模板,匹配文本。
比如,你看到这样的句子:
「华为向台积电采购了100万颗芯片」
我们可以写一条规则:
如果句子中出现「[实体A]向[实体B]采购了[数量][实体C]」
则抽取关系: (实体A, 采购, 实体B, 数量, 实体C)
嗯,这里要注意。规则抽取的优点是精准、可解释。你写一条规则,它就老老实实匹配一条,不会乱来。
但缺点也很明显:
- 规则覆盖不全。同一个关系,可能有十几种表达方式。比如「采购」还可以说「下单」、「订购」、「买入」。
- 维护成本高。我曾在项目中维护过300多条规则,每次新增一个供应商,就要加几条新规则。后来实在扛不住了。
- 跨领域迁移差。电子行业的规则,拿到汽车供应链里,基本全废。
4.2 基于深度学习的关系抽取
深度学习的方法,说白了就是让模型自己学「关系长什么样」。
目前主流的方法有两种:
4.2.1 基于预训练模型(BERT等)
把句子和实体位置一起输入BERT,让模型输出关系类别。
输入: 「[CLS] 华为 [SEP] 台积电 [SEP] 华为向台积电采购了100万颗芯片 [SEP]」
输出: 采购关系 (概率 0.97)
我建议你直接用现成的预训练模型,比如BERT-base-chinese,然后在自己的供应链数据上微调。效果通常比从头训练好得多。
4.2.2 基于远程监督
这个方法很有意思。它利用已有的知识图谱,自动标注文本数据。
比如,你的知识图谱里已经有:
(华为, 供应商, 台积电)
那么,任何同时出现「华为」和「台积电」的句子,都被自动标注为「供应商」关系。
这样做的好处是省人工。但坏处是噪声大。为什么?因为两个实体出现在同一句话里,不一定就是目标关系。比如「华为和台积电都是知名企业」,这句话里它们只是并列关系。
4.3 供应链特有关系的定义
这是整个关系抽取里最核心的部分。
通用知识图谱的关系,比如「父子」、「位于」、「出生于」,在供应链里基本用不上。
供应链需要的是业务关系。我把它归纳为五大类:
| 关系类别 | 典型关系 | 示例 |
|---|---|---|
| 供应关系 | 供应、采购、代工、分销 | (富士康, 代工, iPhone) |
| 物流关系 | 运输、仓储、配送、报关 | (顺丰, 运输, 华为仓库) |
| 财务关系 | 付款、收款、账期、预付款 | (华为, 付款, 台积电, 账期30天) |
| 质量关系 | 质检、合格、退货、索赔 | (质检部, 质检, 物料A, 结果合格) |
| 合同关系 | 签约、续约、违约、终止 | (华为, 签约, 台积电, 合同编号C001) |
我个人习惯,在定义关系时,遵循三个原则:
- 粒度适中。不要分得太细,比如「采购」和「订购」可以合并为「采购关系」。太细了模型学不好。
- 业务可解释。每个关系都要有明确的业务含义。比如「账期30天」这个属性,财务部门一看就懂。
- 可扩展。预留一些自定义关系字段,方便后续业务调整。
4.4 知识体系结构图
下面这张图,把本章的核心逻辑串起来了。你可以看到,关系抽取从规则到深度学习,再到业务定义,是一个层层递进的过程。
你看,从规则到深度学习,再到业务定义,这三者不是互斥的。我现在的做法是:规则兜底,深度学习提效,业务定义定方向。三者结合,才能构建出真正可用的供应链知识图谱。
公众号:蓝海资料掘金营,微信deep3321