一、语义分析的层次
句法研究「词怎么串成句」,语义分析(Semantic Analysis)研究「这句话到底什么意思」。按照语言单位由小到大,语义分析可以分成四个层次:
| 层次 | 关注对象 | 代表任务 |
|---|---|---|
| 词义层 | 多义词的具体义项 | 词义消歧 WSD |
| 句义层 | 谁对谁做了什么 | 语义角色标注 SRL |
| 句间关系 | 两句能否互相推出 | 文本蕴含 NLI |
| 篇章层 | 共指、连贯、主旨 | 共指消解、篇章结构 |
在深度学习时代,越来越多的语义任务被统一为「文本对」问题:把两个句子拼进 BERT 类模型,直接输出相似、蕴含或矛盾。
二、词义消歧
词义消歧(Word Sense Disambiguation, WSD)要判断一个多义词在当前语境中应取哪个义项。
“苹果”在两个语境中意义完全不同:
① 他吃了一个苹果。 → 水果义
② 苹果发布了新手机。 → 品牌义
“打”是汉语中义项最多的动词之一:
打球 / 打水 / 打电话 / 打毛衣 / 打的
三种经典思路:
- 基于词典:查 WordNet / 知网(HowNet)中的义项定义,与上下文比对相似度;
- 基于监督学习:人工标注每个义项的例句,训练分类器(特征为周围词、词性);
- 基于无监督:对词的上下文聚类,自动归纳义项。
现代方案则是动态词向量:BERT 根据上下文为同一个词产生不同向量,消歧被隐式完成。
三、语义角色标注
如果说依存句法给出的是语法骨架,语义角色标注(Semantic Role Labeling, SRL)则站在谓词(动词)的角度,标出事件的参与者:
- 施事 A0:动作的发出者(谁做的);
- 受事 A1:动作的承受者(对谁/什么做的);
- 附加语义角色:时间(TMP)、地点(LOC)、方式(MNR)、原因(CAU)等。
小明 昨天 在 北京 把 人工智能 学 完了
A0 TMP LOC A1 谓词
施事 时间 地点 受事
核心问题:谁(A0)在什么时间(TMP)、什么地点(LOC),
对什么(A1)做了什么(谓词)
SRL 是问答机器人理解问句的重要武器:「谁」问的是施事,「何时/何地」问的是时间/地点角色,系统据此构造检索条件。
python · HanLP SRL(示意)import hanlp
srl = hanlp.load(hanlp.pretrained.srl.CPB3_SRL_ELECTRICA_BASE_ZH)
print(srl([["小明", "昨天", "在北京", "学习", "人工智能"]]))
# {'学': [('ARG0', (0,1)), ('TMP', (1,2)),
# ('LOC', (2,3)), ('ARG1', (4,5))]}
四、文本蕴含与篇章语义
文本蕴含识别(NLI)
给定前提(Premise)与假设(Hypothesis),判断两者关系是蕴含、矛盾还是中立:
| 前提 | 假设 | 关系 |
|---|---|---|
| 小明在北京学完了人工智能 | 小明学习过人工智能 | 蕴含(必然成立) |
| 小明在北京学习人工智能 | 小明从未接触过AI | 矛盾 |
| 小明在北京学习人工智能 | 小明成绩很好 | 中立(无法判断) |
NLI 常用于事实验证(RAG 中核查模型回答是否被资料支持)、问答答案校验。
共指消解
把「他、它、这家公司」等代词或指称还原到真实对象:
小明1说他1喜欢这家公司2,它2的产品很好。
没有共指消解,多轮对话中的「那它呢?」便无从回答——这是对话系统(第九章)绕不开的能力。
五、语义相似度计算
语义相似度回答:两句话说法不同,意思有多接近?它是 FAQ 问答、去重、释义识别的核心。方法按表示层次递进:
- 字面重合:Jaccard 系数、编辑距离——快,但「电脑」与「计算机」会被判为无关;
- 词袋向量 + 余弦:第五章方法,开始考虑词频权重;
- 词向量聚合:把句中 Word2Vec 词向量求平均,再算余弦,同义不同字也能相似;
- 句向量模型:Sentence-BERT 等专门为句对训练的模型输出句向量,是当前工业常用方案;
- 交互式模型:Cross-Encoder 让两句话在注意力层深度交互,精度最高但需逐对计算,适合精排。
python · 词向量平均做句向量(示意)import numpy as np
def sentence_vec(text, w2v_model):
vecs = [w2v_model.wv[w] for w in jieba.lcut(text)
if w in w2v_model.wv]
return np.mean(vecs, axis=0) if vecs else np.zeros(100)
def cosine(a, b):
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b) + 1e-9)
六、交互演示与小结
下面用词袋向量 + 余弦相似度现场测量两句中文的语义近似度。建议三组对照实验:① 用词高度重合的两句;② 意思相近但用词不同(如「电脑/计算机」);③ 话题完全不同。体会词袋方法的能力边界——词向量与句向量模型正是为弥补第二组的失效而生。
语义层之上,还有一层更贴近人感受的维度:文字背后的情绪与褒贬。下一章,我们进入情感分析。