计算语义学深度指南

文档概述

本文档系统性地介绍计算语义学的核心概念、理论框架及其与自然语言处理(NLP)的深度关联。计算语义学是连接语言学理论与计算机科学的桥梁学科,旨在形式化地表示和计算自然语言的语义信息。

关键词速览

术语英文核心定义
词汇语义学Lexical Semantics研究单词意义及其相互关系
句子语义学Sentence Semantics研究句子级别的意义组合
话语语义学Discourse Semantics研究超越句子的文本意义
语义角色标注Semantic Role Labeling识别句中语义关系
框架语义学Frame Semantics通过框架理解词义
语义网络Semantic Network图结构表示语义知识
词义消歧Word Sense Disambiguation消除词语歧义
语义相似度Semantic Similarity度量词语/句子语义距离
EntailmentTextual Entailment文本蕴含关系
知识表示Knowledge Representation形式化表示知识

一、语义学概述与分支体系

1.1 语义学的学科定位

语义学(Semantics)是研究语言意义的学科,其研究范围涵盖了从最小的语义单位——语素(morpheme)——到复杂的篇章结构。在计算语义学(Computational Semantics)的框架下,我们需要将这些语言学理论转化为可计算的形式,以便计算机能够处理和理解自然语言。

语义学的核心问题可以归纳为以下几个维度:

  1. 意义是什么? 如何定义和形式化语言的语义内容
  2. 意义如何组合? 小粒度语义单元如何组合成更大单位的意义
  3. 语境的作用是什么? 上下文如何影响意义的理解和消歧
  4. 知识与语义的关系? 世界知识如何支撑语言理解

1.2 语义学的三大分支

1.2.1 词汇语义学(Lexical Semantics)

词汇语义学关注单词层面的意义,是计算语义学的基础。其核心研究内容包括:

词义表征 词义可以通过多种方式表征,包括:

  • 指称(Referent):词语与其所指代的世界实体之间的关系
  • 概念(Concept):词语在人类认知系统中的心理表征
  • 使用(Usage):词语在语言社群中的典型使用模式和分布

词义关系 词汇语义学研究的经典关系类型包括:

关系类型定义示例
同义词(Synonymy)意义相同或极其相近”快乐”-“高兴”
反义词(Antonymy)意义相反”是”-“否”
上位词(Hypernymy)概念泛化关系”动物”是”狗”的上位词
下位词(Hyponymy)概念特化关系”玫瑰”是”花”的下位词
部分-整体(Meronymy)组成关系”车轮”是”汽车”的部件
主题关联(Associative)联想关系”医生”-“医院”

词汇语义歧义 自然语言中的词汇歧义是NLP的核心挑战之一。例如,“bank”可以指”银行”(金融机构)或”河岸”(地理实体)。词义消歧(WSD)任务正是为了解决这一问题。

1.2.2 句子语义学(Sentence Semantics)

句子语义学研究如何从词汇组合成句子级别的意义。这涉及到:

组合性原则(Principle of Compositionality) 组合性原则是形式语义学的核心假设,由Frege提出,其表述为:

复合表达式的意义由其组成部分的意义及其组合方式决定。

这一原则的数学表达可以写作:

其中 是语义组合函数。

论元结构(Argument Structure) 每个动词都会选择特定数量和类型的论元,形成其论元结构。例如:

  • “吃”需要施事(Agent)和受事(Theme):“小明吃苹果”
  • “给”需要三个论元:“小明给小红一本书”

语义类型系统 在类型论语义学中,我们为表达式分配语义类型:

  • :实体类型(entity)
  • :真值类型(truth value)
  • :谓词类型(一元谓词)
  • :二元关系类型

1.2.3 话语语义学(Discourse Semantics)

话语语义学超越句子边界,研究文本层面的连贯性和意义。其核心概念包括:

指代消解(Coreference Resolution) 识别文本中指向同一实体的不同表达式:

  • 直接指代:“笑着说”(指代前文提到的人)
  • 指示指代:“个问题”(指向当前语境中的某物)
  • 零形指代:省略主语的情况

篇章衔接(Discourse Coherence) 篇章连贯性的理论基础包括:

  • 修辞结构理论(RST):分析句子之间的修辞关系
  • 衔接理论:研究显性的语言连接手段

二、语义角色标注(Semantic Role Labeling, SRL)

2.1 任务定义

语义角色标注是识别句子中谓词与其论元之间语义关系的任务。对于句子”小明昨天在公园看书”,其SRL结果可能是:

论元语义角色描述
小明AGENT(施事)动作的执行者
看书PREDICATE(谓词)核心动作
昨天TEMPORAL(时间)动作发生的时间
在公园LOCATIVE(地点)动作发生的地点

2.2 语义角色类型体系

FrameNet项目定义了丰富的语义角色框架。以下是常见的核心角色类型:

通用语义角色(根据Levin的动词分类):

语义角色分类
├── 核心角色
│   ├── Agent(施事):动作的有意执行者
│   ├── Patient(受事):动作承受者
│   ├── Theme(主题):被描述的实体
│   ├── Experiencer(经历者):感知/情感体验者
│   └── Stimulus(刺激物):引发体验的实体
├── 边缘角色
│   ├── Instrument(工具):执行动作的手段
│   ├── Location(地点):空间位置
│   ├── Time(时间):时间位置
│   └── Cause(原因):动作的原因
└── 角色变体
    ├── Source(起点):运动/变化的起点
    ├── Goal(终点):运动/变化的目标
    └── Path(路径):运动经过的路线

2.3 SRL的计算方法

基于句法的方法 早期的SRL系统主要依赖句法分析结果:

  1. 对输入句子进行句法分析(短语结构或依存分析)
  2. 根据谓词的论元结构模板提取候选论元
  3. 使用分类器验证和选择正确的论元

基于深度学习的方法 现代SRL系统广泛使用神经网络:

# SRL深度学习模型伪代码
class SRLModel(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, num_roles):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        self.encoder = nn.LSTM(embed_dim, hidden_dim, bidirectional=True, batch_first=True)
        self.role_classifier = nn.Linear(hidden_dim * 2, num_roles)
        
    def forward(self, tokens, predicate_position):
        # tokens: [batch_size, seq_len]
        # predicate_position: [batch_size]
        embedded = self.embedding(tokens)
        encoded = self.encoder(embedded)  # [batch, seq_len, hidden*2]
        
        # 对每个位置预测语义角色
        role_logits = self.role_classifier(encoded)
        return role_logits

预训练模型时代的方法 当前最先进的SRL系统利用预训练语言模型(如BERT)作为编码器:

输入表示 = Token嵌入 + 位置嵌入 + 谓词标记嵌入
         ↓
    BERT编码器
         ↓
    角色分类层 → 输出每个token对应的语义角色

2.4 评估指标与资源

常用数据集

  • CoNLL-2005:经典SRL评测数据集
  • CoNLL-2012:跨语言SRL数据集
  • FrameNet:基于框架语义学的标注资源

评估指标

  • 精确率(Precision):正确标注的比例
  • 召回率(Recall):标注出的正确角色比例
  • F1值:精确率和召回率的调和平均

三、语义网络与知识表示

3.1 语义网络基础

语义网络(Semantic Network)是一种用图结构表示知识的形式化方法。在语义网络中:

  • 节点表示概念、实体或事件
  • 表示概念之间的关系

基本语义关系

       is-a (上位关系)
动物 ──────────→ 生物
  │
  │ part-of (组成关系)
  ↓
车轮 ──────────→ 汽车
  │
  │ used-by (使用关系)
  ↓
司机

3.2 语义网络的数学表示

从数学角度看,语义网络可以形式化为一组三元组:

其中:

  • 是实体集合
  • 是关系类型集合
  • 表示从头实体 到尾实体 的关系

3.3 知识图谱的语义基础

现代知识图谱(如Wikidata、DBpedia)建立在语义网络理论基础之上:

知识图谱组件语义网络对应
实体(Entity)节点
关系(Relation)边类型
事实(Fact)三元组
本体(Ontology)关系约束和层次结构

嵌入表示 知识图谱嵌入(Knowledge Graph Embedding)将实体和关系映射到连续向量空间:

损失函数设计为使正确三元组的分数最大化:


四、框架语义学(Frame Semantics)

4.1 理论背景

框架语义学由Charles Fillmore在1970年代提出,其核心观点是:理解词语的意义需要激活相关的知识框架

框架是一个与特定语言表达相关的概念结构系统。例如,“交易”框架包含:

  • 买方(Buyer)
  • 卖方(Seller)
  • 商品(Goods)
  • 价格(Price)
  • 交易行为(Transaction)

4.2 FrameNet项目

FrameNet是框架语义学的计算实现,包含:

  • 框架库:定义了1000+语义框架
  • 词元标注:标注了每个词激活的框架
  • 论元结构:标注了框架元素的实现

示例框架:商业交易(Commerce_buy)

框架:Commerce_buy
定义:通过支付货币获得商品的商业行为

框架元素:
├── Buyer(买方):购买商品的主体
├── Seller(卖方):出售商品的主体
├── Goods(商品):被购买的物品
├── Money(货币):支付的对价
└── Theme(主题商品):与Goods同义

词元触发:
- buy, purchase, acquire, shop for...

4.3 框架语义学与NLP应用

框架语义学为多个NLP任务提供理论基础:

槽位填充(Slot Filling) 对话系统中的槽位可对应框架元素:

用户: "帮我订一张明天北京到上海的机票"
框架: Travel (出行)
槽位:
├── Origin: 北京
├── Destination: 上海
├── Departure_time: 明天
└── Transportation_type: 机票

事件抽取 事件可以表示为框架实例的填充:

# 事件抽取的框架表示
event = {
    "frame": "Commerce_buy",
    "frame_elements": {
        "Buyer": "小明",
        "Goods": "iPhone 15",
        "Money": "$999",
        "Seller": None  # 未提及
    },
    "trigger": "购买",
    "position": (5, 8)  # 触发词位置
}

五、计算语义学与NLP的核心关系

5.1 词义消歧(Word Sense Disambiguation, WSD)

任务定义 给定一个多义词及其上下文,WSD任务要求确定该词在特定上下文中的具体词义。

方法分类

方法类型核心思想代表方法
基于知识的方法利用词典/知识库消歧Lesk算法、基于图的方法
基于监督的方法训练分类器预测词义SVM、神经网络
半监督/无监督利用未标注数据聚类、EM算法

Lesk算法的简化版本

def lesk_simplified(word, sentence, wordnet):
    """Lesk算法的简化实现"""
    best_sense = None
    max_overlap = 0
    
    for sense in wordnet.synsets(word):
        # 获取词义定义和例句的词集合
        signature = set(wordnet.synset_gloss(sense).split())
        
        # 与上下文句子比较
        context = set(sentence.split())
        overlap = len(signature & context)
        
        if overlap > max_overlap:
            max_overlap = overlap
            best_sense = sense
    
    return best_sense

5.2 语义相似度计算

词级相似度

词汇语义相似度的计算方法可分为:

  1. 基于路径的方法:根据词在语义网络中的距离计算

  2. 基于信息内容的方法:利用上位层次结构的信息含量

    其中LCS是最低公共上位词(Lowest Common Subsumer)

  3. 基于向量表示的方法:利用词向量计算余弦相似度

句级相似度

句子相似度需要考虑语义组成性:

def sentence_similarity(sent1_emb, sent2_emb, method='cosine'):
    """
    计算句子语义相似度
    sent1_emb, sent2_emb: 句子嵌入向量
    """
    if method == 'cosine':
        # 余弦相似度
        return cosine_similarity([sent1_emb], [sent2_emb])[0][0]
    elif method == 'manhattan':
        # 曼哈顿距离转相似度
        distance = np.sum(np.abs(sent1_emb - sent2_emb))
        return 1 / (1 + distance)

5.3 文本蕴含(Textual Entailment)

任务定义 文本蕴含(T2E)任务判断文本T是否蕴含假设H:

示例

文本T: "今天早上8点,小明在北京机场登上了飞往上海的航班。"
蕴含关系判断:
- H1: "小明今天坐飞机去了上海。" → ✓ 蕴含
- H2: "小明在中国境内旅行。" → ✓ 蕴含
- H3: "小明去了广州。" → ✗ 矛盾
- H4: "小李登上了航班。" → ✗ 否定

神经网络的T2E方法

class TextualEntailmentModel(nn.Module):
    def __init__(self, encoder_name='bert-base-uncased'):
        super().__init__()
        self.encoder = AutoModel.from_pretrained(encoder_name)
        self.classifier = nn.Sequential(
            nn.Linear(self.encoder.config.hidden_size * 3, 512),
            nn.ReLU(),
            nn.Dropout(0.1),
            nn.Linear(512, 3)  # entailment, neutral, contradiction
        )
    
    def forward(self, premise, hypothesis):
        # 双向编码
        p_encoded = self.encoder(**premise).last_hidden_state[:, 0]
        h_encoded = self.encoder(**hypothesis).last_hidden_state[:, 0]
        
        # 三元组特征
        combined = torch.cat([p_encoded, h_encoded, 
                             torch.abs(p_encoded - h_encoded)], dim=-1)
        
        return self.classifier(combined)

六、计算语义学的挑战与前沿

6.1 当前挑战

  1. 组合歧义:相同的词汇组合可能产生不同语义
  2. 隐含知识:文本中未显式表达的背景知识
  3. 跨语言差异:不同语言的语义结构差异
  4. 动态语义:意义的实时变化和新兴用法

6.2 前沿研究方向

  • 神经符号推理:结合神经网络与符号推理
  • 多模态语义:整合视觉、语言等多模态信息
  • 上下文适应:动态适应不同领域和用户
  • 可解释语义:提供语义理解的解释机制

参考文献与推荐阅读

  1. Jurafsky, D., & Martin, J. H. (2023). Speech and Language Processing (3rd ed.). Stanford University.
  2. Fillmore, C. J. (1976). Frame semantics and the nature of language. Annals of the New York Academy of Sciences, 280(1), 20-32.
  3. Baker, C. F., Fillmore, C. J., & Lowe, J. B. (1998). The Berkeley FrameNet project. COLING, 86-90.
  4. Gildea, D., & Jurafsky, D. (2002). Automatic labeling of semantic roles. Computational Linguistics, 28(3), 245-288.
  5. Bowman, S. R., et al. (2015). A large annotated corpus for learning natural language inference. EMNLP.

关联文档