计算语义学深度指南
文档概述
本文档系统性地介绍计算语义学的核心概念、理论框架及其与自然语言处理(NLP)的深度关联。计算语义学是连接语言学理论与计算机科学的桥梁学科,旨在形式化地表示和计算自然语言的语义信息。
关键词速览
| 术语 | 英文 | 核心定义 |
|---|---|---|
| 词汇语义学 | Lexical Semantics | 研究单词意义及其相互关系 |
| 句子语义学 | Sentence Semantics | 研究句子级别的意义组合 |
| 话语语义学 | Discourse Semantics | 研究超越句子的文本意义 |
| 语义角色标注 | Semantic Role Labeling | 识别句中语义关系 |
| 框架语义学 | Frame Semantics | 通过框架理解词义 |
| 语义网络 | Semantic Network | 图结构表示语义知识 |
| 词义消歧 | Word Sense Disambiguation | 消除词语歧义 |
| 语义相似度 | Semantic Similarity | 度量词语/句子语义距离 |
| Entailment | Textual Entailment | 文本蕴含关系 |
| 知识表示 | Knowledge Representation | 形式化表示知识 |
一、语义学概述与分支体系
1.1 语义学的学科定位
语义学(Semantics)是研究语言意义的学科,其研究范围涵盖了从最小的语义单位——语素(morpheme)——到复杂的篇章结构。在计算语义学(Computational Semantics)的框架下,我们需要将这些语言学理论转化为可计算的形式,以便计算机能够处理和理解自然语言。
语义学的核心问题可以归纳为以下几个维度:
- 意义是什么? 如何定义和形式化语言的语义内容
- 意义如何组合? 小粒度语义单元如何组合成更大单位的意义
- 语境的作用是什么? 上下文如何影响意义的理解和消歧
- 知识与语义的关系? 世界知识如何支撑语言理解
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系统主要依赖句法分析结果:
- 对输入句子进行句法分析(短语结构或依存分析)
- 根据谓词的论元结构模板提取候选论元
- 使用分类器验证和选择正确的论元
基于深度学习的方法 现代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_sense5.2 语义相似度计算
词级相似度
词汇语义相似度的计算方法可分为:
-
基于路径的方法:根据词在语义网络中的距离计算
-
基于信息内容的方法:利用上位层次结构的信息含量
其中LCS是最低公共上位词(Lowest Common Subsumer)
-
基于向量表示的方法:利用词向量计算余弦相似度
句级相似度
句子相似度需要考虑语义组成性:
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 当前挑战
- 组合歧义:相同的词汇组合可能产生不同语义
- 隐含知识:文本中未显式表达的背景知识
- 跨语言差异:不同语言的语义结构差异
- 动态语义:意义的实时变化和新兴用法
6.2 前沿研究方向
- 神经符号推理:结合神经网络与符号推理
- 多模态语义:整合视觉、语言等多模态信息
- 上下文适应:动态适应不同领域和用户
- 可解释语义:提供语义理解的解释机制
参考文献与推荐阅读
- Jurafsky, D., & Martin, J. H. (2023). Speech and Language Processing (3rd ed.). Stanford University.
- Fillmore, C. J. (1976). Frame semantics and the nature of language. Annals of the New York Academy of Sciences, 280(1), 20-32.
- Baker, C. F., Fillmore, C. J., & Lowe, J. B. (1998). The Berkeley FrameNet project. COLING, 86-90.
- Gildea, D., & Jurafsky, D. (2002). Automatic labeling of semantic roles. Computational Linguistics, 28(3), 245-288.
- Bowman, S. R., et al. (2015). A large annotated corpus for learning natural language inference. EMNLP.
关联文档