想象你正在组织一场二十年后的老同学聚会。你面前摆着一堆泛黄的同学录、班级群聊天记录和朋友圈截图,上面写着“王晓是那个健身房的创始人”“李明在杭州定居了”“赵佳毕业于北京大学”。你需要把这些零散的文字变成一张清晰的人物关系图——谁和谁是合伙人、谁在哪个城市、谁是谁的校友。这个过程,就是自然语言处理里大名鼎鼎的“关系抽取”(Relation Extraction,简称 RE)。它要做的事非常纯粹:从非结构化文本中找出两个实体之间的语义联系,输出成“(实体1, 关系,实体2)”这样的三元组,比如 (王晓,创始人,健身房)、(李明,定居城市,杭州)。这套本领是构建知识图谱、智能问答和信息抽取系统的地基——机器一旦学会“读关系”,就能把海量文档变成可检索、可推理的结构化知识。接下来,我们就沿着“整理同学录”这条故事线,把关系抽取的原理、方法路径和评估标准一网打尽。
掌握关系抽取,是构建知识图谱、搭建智能问答系统的核心技能,能帮你把非结构化文本转化为机器可用的结构化知识,是 NLP 工程师的必修课之一。
目录
可视化演示
展示NLP关系抽取的完整流程:文本到实体对识别再到关系分类的三元组提取,以及规则、监督学习、远程监督三种方法的精确率召回率对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
关系抽取流程:文本到三元组 输入文本经NER识别实体,再对实体对进行关系分类 关系分类输出三元组,构建知识图谱的边 Triple = (Head, Relation, Tail) 关系抽取从非结构化文本中提取结构化关系。
任务概述:从文本到关系图
组织同学聚会的第一步,是先把散落在各处的“人物线索”收集起来:谁的名字出现了、被提到了多少次、出现在什么语境里。这些线索就是自然语言处理中的实体——人名、公司名、地名等具体对象。而关系抽取要做的,是在实体之上再进一步:不仅知道“马云”和“阿里巴巴”都出现了,还要知道“马云是阿里巴巴的创始人”这一层联系。就像主办人不能只记下到场人员的名单,还得在名单边上标注“这位是那位的老搭档”。
从技术上讲,关系抽取是信息抽取的核心子任务,位于实体识别之后、知识图谱构建之前。它的输入是一段非结构化文本,输出是一组结构化的关系三元组。上游的实体识别负责回答“谁在哪里”,关系抽取则负责回答“他们之间是什么关系”,两者串联起来,才构成完整的“读人读事”能力。下游的应用非常广:搜索引擎的知识图谱、电商的图谱推荐、医疗病历的结构化,都依赖这一步把句子“拧”成图谱上的边。
一个关系三元组可以形式化地定义为:
回到同学录的比喻:实体就是“通讯录里的名字”,关系三元组就是“在名字之间画出的连线”。主办人最终拿出的人脉关系图,本质上就是一张由无数三元组拼成的知识图谱,而画每一条线,都是一次关系抽取。
- 头实体 h关系记录中的主动方,比如“马云是阿里的创始人”中的马云,它从实体集合 E 中取出。
- 尾实体 t关系所指向的被动方,比如同一句话中的阿里巴巴,同样来自实体集合 E。
- 关系类型 r连接头尾实体的语义纽带,取值限定在预先设计好的关系类型集合 R_s 中。
- 三元组集合 R所有合法 (h, r, t) 组成的集合,即关系抽取最终要输出的结构化结果。
关系分类体系:给关系上户口
主办人拿到一堆关系线索时,第一反应可能是:关系也分很多种啊!“创始人和公司”是开创关系,“出生地和人物”是地域关系,“毕业于和学校”是教育经历关系。如果不事先把这些关系分类定好,后面所有步骤都会乱套。这个“给关系上户口”的工作,在技术叫关系分类体系设计,它决定了系统能为哪些语义联系发“身份证”。
关系分类体系最常见的是预定义关系模式:由领域专家事先枚举出所有关心的关系类型,比如人物-公司-职位、药物-疾病-治疗等,模型的任务就是把每个实体对归入其中一个类别。与之相对的是开放关系抽取,它不预先枚举关系类型,而是直接从句子中动态挖掘“动词短语”作为关系标签,适合关系无法穷举的开放领域。设计时还要注意关系粒度:类型太粗会丢失信息,太细则标注困难、类别不平衡严重。
把关系识别建模化,可以看成在给定实体对时选出一个最可能的类别:
关系分类体系就像同学录上印好的那排“关系勾选项”:同事、室友、同桌、合作伙伴。选项设计得越贴合实际,主办人填写时就越省力;反过来,如果只印了“认识”和“不认识”,这张关系图也就没什么参考价值了。
- 给定实体对 (h,t)已经定位到两个实体,问题退化为“这两人之间到底是什么关系”。
- 条件概率 P(r|h,t)在已知实体对的条件下,每个候选关系类型都有出现概率,概率越大越可信。
- 遍历候选关系把预定义关系集合 R_s 中的类型逐个拿出来比较得分。
- arg max 决策在所有候选中挑出概率最高的作为最终输出的关系类型。
规则驱动方法:老师傅的经验手册
最原始也最直观的抽取方式,靠的是“老师傅的肉眼和经验”。主办人翻了三天聊天记录,总结出一条规律:凡是出现“某某是某某的创始人”这种句式,十有八九是创业合作关系;凡是“某某毕业于某某大学”,就是校友关系。他把这些句式写成一张经验手册,交给实习生照着匹配。这就是规则驱动方法——用人工编写的模板和触发词去文本中做模式匹配。
规则驱动方法的核心是模板匹配和触发词模式。比如模板“X 是 Y 的创始人”命中句子“马云是阿里巴巴的创始人”,就把 X 填为实体1、Y 填为实体2、关系定为“创始人”。进阶一点的做法是利用句法模式,借助分词、词性标注和依存句法树,把模板从“字面字符串”升级为“句法结构”,从而提高泛化能力。这类方法的优点是解释性强、无需训练数据、在小规模垂直场景中立竿见影;缺点也很明显——语言表达千变万化,规则永远追不上人们的说法。
一条模板规则的匹配过程可以写成:
老师傅的经验手册在“话术高度统一”的场景里特别好用,比如公司内部公告、简历模板——大家都按固定格式写,规则一抓一个准。可一旦遇到“那位互联网巨头的掌舵人是马云”这种绕弯子的表达,手册就翻不动了,这就需要下一节更聪明的学习型选手出场。
- 头实体槽位 E1模板中的第一个占位符,等待句子中的“谁”来填入。
- 上下文模板 Pattern连接两个实体的固定句式或触发词,是规则引擎的判别核心。
- 尾实体槽位 E2模板中的第二个占位符,等待句子中的“什么”来填入。
- 规则触发输出三个槽位全部被文本填满即命中规则,输出一条三元组记录。
监督学习方法:带标签的课堂
既然规则手册覆盖不了千变万化的说法,那就让机器自己“悟”。主办人请来一位助理,给了他几千张已经标注好的小卡片,每张卡片写着一句话和它对应的关系类别:“乔布斯创立了苹果 → 创始人关系”“米兰是意大利的城市 → 位于关系”。助理对照答案反复揣摩,慢慢就学会了什么样的表达对应什么样的关系。这就是监督学习:用大量人工标注的 (句子,关系) 样本训练一个分类模型。
监督式关系抽取最早靠特征工程,人工设计词法、句法和实体特征喂给分类器;后来CNN 通过卷积核自动捕捉局部 n-gram 模式,RNN 通过循环结构建模整个句子的序列依赖。近几年 BERT 等预训练模型成了主力,它用自注意力机制把每个词放到整个句子的语境里去理解,实体周围的上下文被编码成丰富的语义向量,关系识别精度大幅提升。无论哪种模型,最后一步都是对“这个句子属于哪个关系类别”做多分类。
模型的分类输出通常用 softmax 归一化为概率:
助理经过几百张卡片的训练,就成了比老师傅手册灵活得多的“关系鉴别师”——他没见过“那位互联网巨头的掌舵人”这种说法,却能从“掌舵人”和“巨头”的语境里嗅出创始关系。代价是,上课用的标注卡片需要真金白银的人力去制作,这在数据量大的时候是一笔不小的开销。
- 句子向量化 f(s)编码器把整句话(含实体位置)变成稠密向量,供后续打分使用。
- 关系打分 W^T f(s)每个候选关系用一组权重对句子打分,得分越高越像该关系。
- softmax 分母归一化把所有候选关系的得分做指数变换后求和,构成总分母。
- 概率取最大得分除以总分得到 0 到 1 之间的概率,最大值即预测关系。
远程监督方法:借知识库偷懒标注
人工标注太贵了,主办人灵机一动:校友会不是有一本官方名册吗?名册上写着“某公司创始人”的人,只要聊天记录里同时提到这两个人的名字,大概就可以认定是那个关系吧?这个“拿来主义”的思路,就是远程监督。它不靠人工标注,而是借助一个已有的大型知识库(如 Wikipedia 对应的 Freebase),自动为语料生成标签。
具体流程是知识库对齐:知识库里有一条 (马云,创始人,阿里巴巴),那么凡是同时提到“马云”和“阿里巴巴”的句子,都被自动标上“创始人”关系。一条知识库事实可以批量制造几十上百条训练样本,成本几乎为零。但天下没有免费的午餐,这个自动标注过程伴随着明显的标签噪声——“马云在演讲中批评了阿里巴巴的管理问题”这句话里并没有创始人关系,却照样被打上了“创始人”标签。模型听到太多错误答案,表现自然打折扣。
远程监督的核心假设可以写成:
主办人用名册“远程代标”虽然省力,但也会闹出笑话:两个同名同姓的人被误当成一对搭档。为了挽救这个偷懒方案,研究者提出多实例学习——不再要求每个句子都表达关系,而是把包含同一实体对的一组句子打包,只要“包里至少有一句”表达该关系就让包通过。就像审稿人看一叠证据,不要求每页都有效,只要整叠材料能坐实关系就予以采信。
- 知识库事实 (h,r,t)∈KB知识库中已有的一条“两人有关联”的权威记录。
- 实体共现检测某句子 s 中同时出现了头实体 h 和尾实体 t,这是触发自动标注的前提。
- 自动标签赋值把知识库中的关系 r 直接当作该句子的监督标签,完全省去人工标注。
- 全称量词概括对所有满足共现条件的句子统一套用该规则,批量制造大量训练样本。
评估指标:给系统出一份体检报告
同学聚会结束后,主办人要复盘:助理抽取的关系到底靠不靠谱?这就轮到评估指标登场。评估关系抽取系统,最常用的三件套是精确率(Precision)、召回率(Recall)和 F1 分数。想象助理交来一堆关系卡片,我们需要数清:卡片上的记录有多少是真的(精确);真实存在的关系他又漏掉了多少(召回)。
技术上有四个基础计数:TP 是系统抽出来且正确的关系数,FP 是抽出来但实际不对的关系数,FN 是真实存在但被漏掉的关系数。精确率回答“抽出来的结果有多干净”,召回率回答“真实的关系被找回了多少”。好的系统当然希望两个都高,但它们往往此消彼长——放宽标准能提高召回却引入误报,收紧标准能提高精确却增加漏报,于是用 F1 做调和平均来综合权衡。
三者的计算公式如下:
这就像主办人复核助理的成果:精确率关心“助理交上来的卡片有没有张冠李戴”,召回率关心“该记的缘分有没有漏记”,F1 则是把两方面压成一句总评。在真实的评测数据集(如 SemEval、TACRED)上把 F1 刷上去,几乎是每篇关系抽取论文的终极目标。
P = \frac{TP}{TP+FP},\qquadR = \frac{TP}{TP+FN},\qquadF_1 = \frac{2PR}{P+R}- TP 正确抽取系统抽出的关系中,确实属于目标关系的样本数量。
- FP 误报系统抽出来了,但实际并不构成目标关系的样本数量。
- FN 漏报真实存在目标关系,但系统没有抽出来的样本数量。
- 精确率 P预测为正的结果里真的为正的比例,衡量“抽得准不准”。
- 召回率 R真实关系中被成功找回的比例,衡量“漏得少不少”。
- F1 调和平均把 P 和 R 合并成一个综合分,避免单看一项被带偏。
AI 应用场景
企业级知识图谱自动化构建
阶段:数据准备与预处理
解决的问题:传统知识图谱靠专家手工录入,无法跟上业务数据爆炸式增长;关系抽取可以从海量产品文档、合同、公告中自动抽出“公司与高管”“产品与属性”等三元组,把图表化工作从“人肉填表”升级为“机器流水线”。
具体案例:某互联网公司的搜索团队在构建行业知识图谱时,用远程监督加 BERT 精调的关系抽取管线,从 500 万篇企业新闻中自动抽取“创始人”“融资”“收购”三类关系,把图谱构建周期从三个月压缩到两周,F1 达到 0.86。
医疗电子病历结构化
阶段:特征提取与建模
解决的问题:病历文本中“患者”“症状”“用药”之间的关系是临床决策的关键支撑,但病历写法高度专业化、表达多样;关系抽取模型可以自动识别“阿莫西林→治疗→感染”这类诊疗关系,让非结构化病历变成可查询的结构化数据。
具体案例:某三甲医院信息科部署了基于 BERT 的医疗关系抽取模型,对 10 万份出院小结做药物-疾病关系抽取,自动生成不良反应预警列表,辅助药师审核处方。
智能问答系统的答案定位
阶段:模型推理与决策
解决的问题:用户问“马云的母校是哪里”时,系统需要从文本中定位实体“马云”与“母校”之间的关系;关系抽取把问句与文档都转化成三元组,使问答从关键词匹配升级为语义级的“关系匹配”,显著提升复杂问题的正确率。
具体案例:某银行智能客服利用关系抽取构建“客户-业务-产品”关系网,当用户问“房贷利率是多少”时,系统先抽取问题中的业务实体与关系,再在图谱中定向检索,命中准确率提升了 22%。
Python 演示
# -*- coding: utf-8 -*-# 基于规则的关系抽取与P/R/F1评估演示import re RULES = [ (r'(.+?)是(.+?)的创始人', '创始人'), (r'(.+?)出生于(.+?)', '出生地'), (r'(.+?)毕业于(.+?)', '毕业院校'), (r'(.+?)定居于(.+?)', '定居地'),] def rule_based_extract(text, rules): triples = [] for pattern, rel in rules: for m in re.finditer(pattern, text): e1 = m.group(1).strip(',。') e2 = m.group(2).strip(',。') if e1 and e2: triples.append((e1, rel, e2)) return triples def evaluate(predicted, golden): pred = set(predicted) gold = set(golden) tp = len(pred & gold) precision = tp / len(pred) if pred else 0.0 recall = tp / len(gold) if gold else 0.0 f1 = 2 * precision * recall / (precision + recall) if precision + recall else 0.0 return precision, recall, f1 def main(): sentences = [ '马云是阿里巴巴的创始人,马云出生于杭州。', '张一鸣是字节跳动的创始人,张一鸣毕业于南开大学。', '任正非是华为的创始人。', ] golden = [ ('马云', '创始人', '阿里巴巴'), ('马云', '出生地', '杭州'), ('张一鸣', '创始人', '字节跳动'), ('张一鸣', '毕业院校', '南开大学'), ('任正非', '创始人', '华为'), ('李彦宏', '创始人', '百度'), ] predicted = [] for sent in sentences: found = rule_based_extract(sent, RULES) predicted.extend(found) print('句子:', sent) for t in found: print(' 抽取 ->', t) precision, recall, f1 = evaluate(predicted, golden) print('\n精确率: %.2f 召回率: %.2f F1: %.2f' % (precision, recall, f1)) if __name__ == '__main__': main()
RULES = [(r'(.+?)是(.+?)的创始人', '创始人'), ...]定义“触发词 + 实体槽位”的模板库,是规则方法的核心资产。for m in re.finditer(pattern, text)在句子中扫描所有匹配模板的片段,相当于逐条翻查经验手册。triples.append((e1, rel, e2))把命中的片段组装成 (头实体,关系,尾实体) 三元组。pred = set(predicted); gold = set(golden)用集合去重,方便后续快速计算交集与差集。tp = len(pred & gold)交集大小就是“抽对了”的关系数量 TP。precision = tp / len(pred) if pred else 0.0精确率,回答“抽出来的有多少是靠谱的”。recall = tp / len(gold) if gold else 0.0召回率,回答“真实关系被挖出了多少”。f1 = 2 * precision * recall / (precision + recall)F1 调和平均,综合衡量系统表现。if __name__ == '__main__':提供可执行入口,直接运行即可看到抽取与评估结果。
常见误区
误区我以为关系抽取就是找出文本里的人名地名,把实体都标出来就算完成任务了,根本没注意还有“关系”这个输出。
正解实体识别只是前置的“找谁”步骤,关系抽取的产出必须是“谁和谁之间是什么关系”的三元组。好比同学录上先记下名字,还要标注“同桌、队长、老搭档”才算完整。实体是图的节点,关系才是图的边,二者缺一不可。
为何常见:实体是文本中最显眼的信息,初学者容易把“识别主语”与“分析谓语关系”混为一谈,看到任务名里带“抽取”就以为是在做实体挖掘。
误区远程监督听起来很高端,而且过程里看不到人工标注,所以它应该属于无监督学习,模型自己无师自通。
正解远程监督其实是一种弱监督/自动标注方法:它借已有知识库与语料对齐,自动给句子贴上关系标签,本质是“用程序代劳人工标注”,标签质量可能很差(含噪)。无监督则完全不依赖任何标签,两者从数据来源上就是两码事。
为何常见:名字里的“远程”让人误以为它离标注很远,其实它只是把人工标注换成了知识库映射,“监督”二字恰恰说明它离不开标签。
误区模型评测报告里精确率 0.95,看起来很漂亮,那就直接用这个模型上线吧,其他指标不用管。
正解精确率高可能只是因为它极度保守,10 条里只敢抽 10 条,全对但漏了 100 条真实关系。如同相亲中介只介绍“绝对匹配的 3 个人”,却忽略另外 20 个合适人选。实践中要看 F1,或者结合精确率-召回率曲线,在两个指标之间找平衡点。
为何常见:精确率数值直观、容易理解,很多人习惯用单一数字概括模型质量,忽略了召回率这一面。
误区现在都是 BERT 的天下,基于模板和规则的关系抽取早就过时了,学它纯属浪费时间。
正解规则法在话术固定、规模可控的垂直场景(如表单、公告、简历)依然高效、可解释、零训练成本;在远程监督噪声过滤、标签修正上,规则也常作为辅助手段出现。深度学习擅长泛化,规则擅长精确约束,二者是互补关系而非替代关系。
为何常见:论文和新闻都在渲染深度模型刷榜,让人误以为“老方法”毫无价值,忽视了工业界“性价比优先”的选型逻辑。
误区为了让系统更强大,我把关系类型设计了 80 多种,觉得分类越细抽取能力就越强。
正解关系类别越多,标注难度越陡增、类别不平衡越严重、相似类别的边界越模糊。就像同学录把“认识”拆成“一起吃过饭”“一起开过会”“一起坐过车”几十种,反而没人能填明白。领域建模要按业务需要选择适中粒度,先粗后细地迭代。
为何常见:人们容易把“分类细”等同于“能力强”,忽略了机器学习的样本需求与类别混淆成本,这是把模型性能问题和数据工程问题混为一谈。
面试题
Q1. 关系抽取的核心目标是?
- A.对文本进行情感极性判断
- B.从文本中识别实体间的语义关系← 正确答案
- C.将长文本压缩为简短摘要
- D.把一种语言翻译成另一种语言
答案:B。关系抽取聚焦“谁和谁有什么关系”,输出 (实体1, 关系,实体2) 三元组;情感判断属于情感分析,摘要生成和机器翻译是独立的 NLP 任务,都不以抽取实体间语义联系为目标。
Q2. 关系抽取输出三元组的规范写法是?
- A.实体在前关系居中尾实体在后← 正确答案
- B.关系在前实体居中尾实体在后
- C.实体在前尾实体居中关系在后
- D.文档在前关系居中实体在后
答案:A。关系三元组的标准形式是 (头实体,关系,尾实体),例如 (马云,创始人,阿里巴巴)。关系永远位于两个实体之间,对应“主语-谓语-宾语”的语言学结构,其他排列均为不规范写法。
Q3. 以下哪项不属于关系抽取的直接任务?
- A.识别乔布斯创立苹果的关系
- B.从简历中提取毕业院校信息
- C.判断影评情绪是正面或负面← 正确答案
- D.识别马云出生在杭州的渊源
答案:C。前三个选项分别对应“创立”“毕业院校”“出生地”等关系,都是关系抽取的直接产出;而判断影评情绪属于情感分析,分析的是观点极性而不是实体间的语义联系。
Q4. 规则驱动方法最大的局限是什么?
- A.训练需要海量显卡资源
- B.规则难以覆盖多样的语言表达← 正确答案
- C.无法处理非英文的语料文本
- D.预测结果永远无法解释清楚
答案:B。规则方法靠人工编写模板和触发词,对“马云是阿里的创始人”这类标准句式很有效,但真实语言表达千变万化,规则永远追不上说话方式的多样性。它不需要训练算力,也不分语言,且天然可解释,因此 A/C/D 都不成立。
Q5. 精确率的计算方式是?
- A.正确正例数除以预测正例总数← 正确答案
- B.正确正例数除以真实正例总数
- C.正确负例数除以预测负例总数
- D.全部正确数除以总体样本总数
答案:A。精确率 P = TP / (TP + FP),分母是“系统预测为正例的总数”,回答“抽出来的结果有多干净”。B 描述的是召回率,D 描述的是准确率,C 描述的则是特异度,均与精确率定义不符。
Q6. 远程监督方法的核心假设是什么?
- A.同一实体对在不同句子中说话不同
- B.含同一实体对的句子表达库中关系← 正确答案
- C.知识库必须纯手工构建保质量
- D.模型必须使用无标签数据训练
答案:B。远程监督的假设是:只要知识库中 (h, r, t) 成立,且某句子同时提到 h 和 t,就把该句子自动标为关系 r。这个假设很宽松,也因此带来标签噪声;A 是噪声产生的原因而非假设,C/D 与远程监督无关。
Q7. F1分数本质上是什么?
- A.精确率与召回率的算术平均值
- B.精确率与召回率的调和平均值← 正确答案
- C.精确率与准确率的差值大小
- D.召回率与误差率的线性组合
答案:B。F1 = 2PR / (P + R),是精确率和召回率的调和平均。调和平均对低值更敏感,能防止某一项拖后腿时总分仍然虚高;算术平均(A)会让 0.9 和 0.1 平均成 0.5,而调和平均只有约 0.18,更能暴露偏科问题。
Q8. 基于BERT的关系抽取相比传统CNN模型的最大优势是?
- A.不需要任何预训练语料支撑
- B.能捕捉深层上下文语义信息← 正确答案
- C.参数量更少且计算速度更快
- D.只能处理十个字以内的短句
答案:B。BERT 通过多层自注意力在整句话范围内建模上下文,能区分“马云执掌阿里”和“阿里批评马云”里完全相反的关系方向;而传统 CNN 主要捕捉局部 n-gram 模式。BERT 恰恰依赖海量预训练语料、参数更多更慢,且能处理长句,故 A/C/D 均错误。
Q9. 以下哪些是关系抽取技术的典型应用场景?
- A.知识图谱的自动化构建← 正确答案
- B.智能问答系统的答案定位← 正确答案
- C.弹幕内容实时过滤控制
- D.电子病历诊疗关系提取← 正确答案
答案:ABD。知识图谱需要把文本抽成三元组,问答系统需要借助实体关系定位答案,病历需要抽取“药物→治疗→疾病”的诊疗关系,三者都是关系抽取的典型落地场景;弹幕过滤属于内容审核/文本分类任务,不依赖实体间的语义关系。
Q10. 缓解远程监督标签噪声的常用策略包括?
- A.多实例学习放宽单句假设← 正确答案
- B.结合规则过滤明显错误标签← 正确答案
- C.增加全连接层神经元数量
- D.降低学习率十倍以上幅度
答案:AB。噪声源自“实体对一旦在知识库中有关系,所有含它们的句子都被标为该关系”的粗暴假设。多实例学习把同一实体对的句子打包、只要求包级别匹配,规则过滤能剔除明显错标样本,两者都直接针对噪声;调整神经元数量或学习率只是普通超参数,不解决标签质量问题。