LESSON 14 · 卷 自然语言处理

语言的概率游戏:N-gram

不懂语法、不懂语义,光靠「数数」能不能接出下一个词?

第 1 站

手机怎么猜下一个字

你用手机打字,输入「今天天气」,键盘弹出三个候选词:「真好」「不错」「怎么样」。 它是怎么猜出来的?

手机没有读懂「天气」这个概念,没有联网查天气预报,也没有问过你今天心情好不好。 它做的事情极其简单:翻历史记录,数数

想象手机偷偷读过几千万条中文消息。每次看到「今天天气」这四个字后面跟着什么,就记一笔:

在几千万条消息里,「今天天气」后面跟着……真好4,120不错3,890怎么样2,540好热1,870太差了980
图 14-1「今天天气」后面出现频率最高的词。手机只需按频率排序,就能给出三个候选。

下次你输入「今天天气」,手机就把出现最多的几个词推给你。这就是手机输入法的基本原理——纯粹的数数,和「理解语言」毫无关系。

手机是不是真的「懂」你在说什么?如果你前面刚写了「最近身体不太好」, 它还会推荐「今天天气真好」吗?
第 2 站

让方法更通用:看最近 N 个词

上面的方法每次都看整段「今天天气」这个固定短语—— 如果用户输入的是「今天的天气」,历史记录就完全对不上号了,方法失效。

更实用的做法:不管前面说了多少,只看最近的几个词,用它们来预测下一个词。 看最近 1 个词,叫「一元模型」;看最近 2 个词,叫「二元模型」; 看最近 N 个词,就叫 N-gram(N 元语言模型)。

句子:「我 昨天 买 了 一 只 猫」,预测下一个词昨天N=2:看「只」「猫」→ 预测「咪」「叫」「跑」?
图 14-2N-gram 只看最近 N 个词(蓝色部分),忽略更早的内容。N=2 时,无论前面说了什么,都只用「只」和「猫」来预测下一个词。

实际上,大部分手机输入法和早期语音助手都在用 N=2 或 N=3 的版本。 这个方法简单、快速,而且训练方式也很简单: 爬下大量文本,把每一段连续的 N 个词都数一遍,统计频率,存成一张巨大的表格就完成了。不需要理解语言,不需要语法规则,只需要数数。

这张表长什么样、又怎么「查」?以二元模型(N=2)为例:想预测「天气」后面接什么,就翻到 前文 =「天气」 这一块, 数一数语料里它后面各个词分别出现过多少次,再除以「天气」的总出现次数,就得到每个候选词的概率:

前文 =「天气」 · 语料中 count(「天气」) = 10,000
下一个词 w共现次数 count(「天气」, w)概率 P(w │「天气」) = 次数 ÷ 10,000
真好2,300
23.0%
不错2,100
21.0%
预报1,800
18.0%
怎么样1,500
15.0%
好热1,000
10.0%
香蕉3
0.03%
(其余几千个词合计)1,297
13.0%
图 14-3N-gram 的「查表」长这样(二元模型,前文 =「天气」)。预测时就找到当前前文那一行区块,按概率挑下一个词。注意「香蕉」只共现 3 次、概率几乎为零——语料里没怎么数到的组合,N-gram 就只能给个近乎 0 的概率。整本表里,每一个可能的前文都对应这样一行区块

换个角度看,这张频率表其实就是条件概率:给定前面 N 个词,下一个词出现的可能性有多大。 第 6 课说过,一个语言模型的本质,就是给「下一个词」分配一张概率分布表—— 「今天天气」之后,「真好」占 23%、「不错」占 21%、「香蕉」占 0.001%…… N-gram 就是这个想法最朴素的实现:直接拿历史频率当概率,能数则数,数不到就抓瞎。 后面几课要做的事,都是在换更聪明的方式去估计这同一张概率表。

第 3 站

局限:记性只有两三个词

试着用 N=2 的模型来补完这句话:

「那只从小在胡同里长大、非常怕生人的小猫,今天第一次__」

真正要填的词,应该和「小猫」「怕生人」「第一次」都有关—— 也许是「出门」「见生人」「叫出声来」。 但 N=2 的模型只看最后两个词:「第一次」__。 「第一次」后面最常见的搭配是什么?大概是「听说」「尝试」「见到」…… 完全不知道前面在说一只猫的事。

加大 N 也救不了

你可能想说:N 调大一点不就好了?把 N 从 2 改成 5,看最近 5 个词。 问题是:训练数据里,见过「怕生人的小猫,今天第一次」这整个组合的概率几乎为零。 N 越大,每个具体组合出现的次数越少,大量组合根本从未出现过。

打个比方:你统计了 100 亿条对话,但「非常怕生人的小猫今天第一次出门」这整句话, 一次也没出现过。N-gram 对「没见过的组合」完全束手无策,只能乱猜或者返回「不知道」。 N 越大,「没见过的组合」就越多——两难困境。

N-gram 还有一个更根本的毛病。即使见过「猫」后面接「出门」,也没法推断「小猫」后面能接「出门」。为什么?
第 4 站

N-gram 能做什么,不能做什么

尽管有这些局限,N-gram 在几十年间一直是语言技术的支柱:

  • 手机输入法的候选词推荐
  • 早期语音识别(把声音转成文字时,用 N-gram 过滤掉"听起来像但文法奇怪"的结果)
  • 垃圾邮件过滤(某些词组合在一起高度可疑)
  • 机器翻译的初级版本

它之所以有用,是因为语言里大量的短距离搭配是非常固定的。 「天气」后面接「预报」的概率,远高于接「香蕉」的概率。 这些规律靠数数就能捕捉到,不需要任何深层理解。

但它做不到的事情同样明显:长句子、跨句子的理解、词义的灵活性—— 这些都需要一个能「理解词的含义」而不只是「认识词的形状」的工具。 下一课解决「词」本身的问题。

第 5 站

总结

本课核心 · TAKEAWAY

N-gram 是语言预测的「数数法」: 看最近 N 个词,查历史统计,找最常见的下一个词。 不需要理解语言,只需要一张巨大的频率表。 但它的记性只有 N 个词——超出这个范围的上下文,完全看不到。

这一课你亲手推导了

  • N-gram 的思路:看最近 N 个词 → 查频率表 → 预测下一个词。
  • 训练方式:爬大量文本,统计每段连续词组出现的频率,存成表格。
  • 局限①:只有 N 个词的记性,无法处理长距离依赖。
  • 局限②:把词当成符号,「猫」和「小猫」是两个毫不相关的符号。
小测验

学习小测验

做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。

Q1N-gram 语言模型预测下一个词时,用的是什么思路?
Q2N-gram 模型最致命的问题之一是「稀疏性」,它指的是什么?
NEXT · 第 15 课

词向量

让「猫」和「小猫」有共同点,让「国王−男人+女人≈女王」成立——词的意思如何变成坐标?

0 人点赞,0 人看过