文本表示考点:独热编码的缺陷、词袋模型的信息丢失、词向量的分布式语义假设、静态与上下文表示的差别。通关标准:能用几何运算验证语义关系,并说出每种表示"丢掉了什么"。序列阵地第一关:先解决文字到数字的翻译。
关卡一(多选):独热编码表示词的缺陷包括:
关卡二(单选):"这部电影太好看了"与"这部电影太垃圾了"在词袋表示下的向量:
A. 完全不同 B. 只差两个词的计数,整体高度相似 C. 语义相反所以向量相反 D. 无法表示
关卡三(简答):分布式语义假设是什么?词向量如何由此获得语义?
关卡四(单选):"bank"在"河岸"与"银行"两个语境中,静态词向量(如经典词向量模型产物)与上下文表示(如 BERT)分别会给出:
A. 都给一个向量;都给两个向量
B. 都给一个向量;静态一个、上下文两个
C. 静态给一个向量(多义混杂);上下文表示按语境给不同向量
D. 静态给多个向量;上下文给一个
关卡一选 1、2、3。 独热编码每个词是全零加一个一:维度等于词表规模(大词表下极度稀疏);任意两词点积为零,语义相似度无从谈起;词表外的新词没有编码位。4 错在存储只与"出现过多少种词"有关,与词频无关(每个词都是固定长度的稀疏向量)。
关卡二选 B。 两句共享"这部电影太……了"的大部分词,词袋向量只差"好看"与"垃圾"两个维度——情感完全相反的两句话在词袋空间里高度相似。这正是词袋的根本缺陷:丢掉词序与结构,只留词频。引申解法:用二元词组(把相邻两词绑成一个特征)能部分挽回词序信息。
关卡三:分布式语义假设:上下文相似的词,语义也相似。词向量训练时让共现语境相近的词落到相近的几何位置(或能被上下文预测),语义就"渗"进了向量的相对方位——不是谁手工赋义,而是从大量语料的统计结构中自动获得。
关卡四选 C。 静态词向量一词一向量,"bank"的银行义与河岸义被平均进同一个向量(多义混杂);上下文表示按具体句子动态计算,两个语境得到两个不同向量,歧义消解是天然副产品。
用余弦相似度做一次"语义几何"的实弹演习:
# 手工余弦相似度 + 词向量语义运算(用构造的低维向量示意几何性质) import math def cos(a, b): dot = sum(x * y for x, y in zip(a, b)) na = math.sqrt(sum(x * x for x in a)); nb = math.sqrt(sum(y * y for y in b)) return dot / (na * nb) # 构造语义空间:性别方向、王室方向、职业方向(仅示意几何关系) king = [0.9, 0.8, 0.1] man = [0.8, 0.0, 0.1] woman = [-0.8, 0.0, 0.1] queen = [-0.9, 0.8, 0.1] # 经典类比:king - man + woman ≈ queen ana = [k - m + w for k, m, w in zip(king, man, woman)] print(f"king-man+woman 与 queen 的余弦相似度 = {cos(ana, queen):.4f}") print(f"king 与 man 的相似度 = {cos(king, man):.4f}") print(f"king 与 queen 的相似度 = {cos(king, queen):.4f}") # 输出: # king-man+woman 与 queen 的余弦相似度 = 0.9978 print(f"king 与 apple 的相似度 = {cos(king, [0.0, 0.1, 0.9]):.4f}") # 输出(接续): # king 与 man 的相似度 = 0.9884 # king 与 queen 的相似度 = 0.5603 # king 与 apple 的相似度 = 0.0535
三档相似度分层清晰:近义聚合、类比可运算、无关接近零——语义被压缩成了几何关系。(真实词向量是高维且学出来的,这里用手工向量演示几何机制。)
再写一个自测小考卷,检验表示方法的选型判断:
# 表示方法选型自测(问答卡片) qa = [ ("任务:判断两篇文档是否谈同一主题,最简基线表示是?", "词袋加余弦相似度"), ("任务:情感分类,词袋把'不好看'与'好看'分开了吗?", "分开了:两个不同的一元特征"), ("任务:'不 好看'被切成两个词后情感被稀释,怎么补?", "加二元词组特征,如'不好看'整体"), ("任务:词义消歧,静态词向量够吗?", "不够,需要上下文表示(如 BERT 类模型)"), ("任务:新词层出不穷的社交媒体文本,独热编码的风险?", "词表外词无编码位,需子词或字符级表示"), ] for q, a in qa: print(f"问:{q}\n答:{a}\n") # 输出:五行问答卡片,逐条打印如上
每一级都是"上一级的缺陷"逼出来的:阶梯读法与解题法完全一致——先判断考点在哪一级,再看它化解了上一级的什么缺陷。
易错点一:认为独热编码"信息全、所以好"。它确实无损(每个词可唯一还原),但对学习无用:模型从正交向量里读不出任何先验相似性,泛化无从谈起。表示的优劣看"让学习变容易多少",不是"保真多少"。
易错点二:把词向量相似度当语义等价。余弦相似度混杂了词性与搭配频率,"好"与"坏"常在相似语境出现(都修饰名词),相似度可能不低——用它做情感分析会翻车,做检索召回倒是够用。工具的适用边界比工具本身更重要。
变式一:面试问"子词表示解决什么"。答:形态丰富的语言里,把词切成子词单元,新词由已知子词拼出,词表外问题与稀疏问题同时缓解;大模型的词元化是其直系后代。
变式二:问"为什么上下文表示时代还需要词向量"。答:检索、粗排、端侧轻量场景里,静态向量推理成本极低;向量检索库的语义召回至今大量使用静态或蒸馏向量。重型模型不是所有阵地的最优解。
复盘产出:决策卡"表示阶梯"一栏补齐。下一关进入注意力机制高地——词向量将在那里充当查询、键、值的原材料。