语义角色标注:回答“谁对谁做了什么”

FreeGuideOnline 最新 2026-06-15

什么是语义角色标注

语义角色标注 (Semantic Role Labeling,简称 SRL) 是自然语言处理中的一项基础任务,其核心目标是回答“谁对谁做了什么”。它能够识别句子中各个成分所扮演的语义角色,比如动作的发出者、承受者、时间、地点等,从而将句子从表面词语序列转化为结构化的语义表示。

简单来说,语义角色标注就像给句子中的每个部分贴上“功能标签”:

  • 做的 —— 施事 (Agent)
  • 了什么 —— 谓词/动作 (Predicate)
  • 对谁做的 —— 受事 (Patient/Theme)
  • 在哪儿做的 —— 地点 (Location)
  • 什么时候做的 —— 时间 (Time)
  • 什么工具 —— 工具 (Instrument)

这一技术广泛用于信息抽取、问答系统、机器翻译和文本摘要等场景,因为它让机器真正开始“理解”事件结构。


核心概念解析

谓词与论元

在语义角色标注中,句子被分解为两个关键部分:

  • 谓词 (Predicate):句子中表达动作或状态的核心词,通常是动词,也可以是名词或形容词。例如,“攻击”在“敌军攻击了要塞”中就是谓词。
  • 论元 (Argument):与谓词语义相关的成分,扮演特定的语义角色。论元分为核心论元附加论元

核心语义角色

最核心的角色直接回答“谁对谁做了什么”:

角色 标签 说明 例句
施事 A0 动作的有意识发出者 侦察兵发现了目标。
受事 A1 动作的承受者或对象 侦察兵发现了目标
工具 A2 动作使用的工具、方式或受益人 他用望远镜发现了目标。
起点 A3 动作开始的地点或来源 从哨所出发。
终点 A4 动作结束的地点或去向 他返回了基地

这些标签在不同语料库中可能略有差异,但A0-A4是最通用的框架。

附加语义角色

除了核心角色,句子中还经常出现描述时间、地点、原因等背景信息的成分,统称为附加语 (Adjunct) 或 ArgM:

  • ArgM-LOC:地点 —— 在森林里
  • ArgM-TMP:时间 —— 昨天夜里
  • ArgM-MNR:方式 —— 秘密地
  • ArgM-PNC:目的 —— 为了获取情报
  • ArgM-CAU:原因 —— 因为天气恶劣

语义角色标注是如何工作的

现代语义角色标注主要依赖深度学习模型,其工作流程通常包含四个阶段:

阶段一:谓词识别

模型首先找出句子中哪些词是谓词。对于中文,一个句子可能有多个谓词,例如:“下令撤退的指挥官发现了埋伏”。系统需要识别出“下令”和“发现”两个谓词。

阶段二:论元边界识别

围绕每一个谓词,模型需要确定描述该动作的各个论元在句子中的起止位置。这是一个序列标注任务,通常使用 BIO 标注模式:

  • B-ARG:论元的起始词
  • I-ARG:论元的内部词
  • O:不属于任何论元

阶段三:角色分类

找出每个论元的边界后,模型为每一段赋予确切的语义标签,如 A0、A1、ArgM-LOC 等。这一步会结合谓词与候选论元的上下文信息进行判断。

阶段四:全局优化

对于多谓词句子,同一个词可能作为不同谓词的论元,模型需要综合所有谓词的结果,确保标注整体一致。


初学者动手实践指南

你可以使用成熟的工具快速体验语义角色标注,无需从头训练模型。

使用 HanLP 进行中文语义角色标注

HanLP 是一个功能丰富的自然语言处理工具包。以下是 Python 示例:

import hanlp

# 加载预训练的语义角色标注模型
srl = hanlp.load(hanlp.pretrained.srl.SRL_CTB5_ROBERTA_BASE)

# 输入句子
sentence = "指挥官用望远镜发现了远处的敌军哨所。"

# 执行标注
result = srl(sentence)

# 输出结果
print(result)

输出将是一个列表,每个元素对应一个谓词的标注结果,清晰显示谓词、论元和角色标签。

使用 spaCy 与 AllenNLP (英文)

对于英文,AllenNLP 的 SRL 模型十分经典:

from allennlp_models import pretrained
predictor = pretrained.load_predictor("structured-prediction-srl-bert")

sentence = "The commander spotted the enemy with binoculars."
result = predictor.predict(sentence)

for verb in result["verbs"]:
    print(f"谓词: {verb['verb']}")
    for tag, word in zip(verb["tags"], result["words"]):
        if tag != "O":
            print(f"  {tag}: {word}")

常见挑战与未来方向

  • 隐式语义角色:中文常省略 A0 或 A1,需要通过上下文恢复,这对模型是巨大考验。
  • 非动词谓词:名词化谓词(如“袭击造成伤亡”中的“袭击”)需要灵活识别。
  • 领域迁移:新闻语料训练的模型应用到医疗、法律文本时,性能可能下降。
  • 多语言统一:不同语言的角色体系并不完全一致,跨语言标注是研究前沿。

当前,基于大语言模型的方法正尝试将语义角色标注转化为对话式任务,无需显式定义角色体系,而是直接抽取“谁对谁做了什么”的三元组,这为这项经典任务带来了新的可能性。


小结

语义角色标注通过揭示“谁对谁做了什么”的结构,为机器提供了理解事件的基础框架。无论是传统的 PropBank 标注体系,还是现代的端到端深度学习模型,其本质都在于将语言符号映射为可计算的语义表示。对于初学者而言,先掌握核心角色、学会使用现成工具解析句子,是进入这一领域的最佳路径。