第 七 章

语义分析

言外有意,弦外有音

一、语义分析的层次

句法研究「词怎么串成句」,语义分析(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 问答、去重、释义识别的核心。方法按表示层次递进:

  1. 字面重合:Jaccard 系数、编辑距离——快,但「电脑」与「计算机」会被判为无关;
  2. 词袋向量 + 余弦:第五章方法,开始考虑词频权重;
  3. 词向量聚合:把句中 Word2Vec 词向量求平均,再算余弦,同义不同字也能相似;
  4. 句向量模型:Sentence-BERT 等专门为句对训练的模型输出句向量,是当前工业常用方案;
  5. 交互式模型: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)
工程上常见两阶段检索:先用轻量句向量(双塔)从百万 FAQ 中召回 Top 20,再用 Cross-Encoder 精排出最佳答案——第九章的问答机器人会复用这套架构。

六、交互演示与小结

下面用词袋向量 + 余弦相似度现场测量两句中文的语义近似度。建议三组对照实验:① 用词高度重合的两句;② 意思相近但用词不同(如「电脑/计算机」);③ 话题完全不同。体会词袋方法的能力边界——词向量与句向量模型正是为弥补第二组的失效而生。

语义相似度观测台词袋向量 · 余弦

语义层之上,还有一层更贴近人感受的维度:文字背后的情绪与褒贬。下一章,我们进入情感分析。