# n-gram 语言模型核心概念整理

## 一、n-gram 模型的基本思想

n-gram 模型做了一个 **n-1 阶马尔可夫假设**：

> 一个词出现的概率只与它前面的 **n-1 个词**相关，而不是与整个历史相关。

### 正确数学表达

对于词序列 \(w_1, w_2, \dots, w_k\)：

\[
P(w_k \mid w_1^{k-1}) \approx P(w_k \mid w_{k-n+1}^{k-1})
\]

其中：

- \(w_1^{k-1}\)：从第 1 个词到第 \(k-1\) 个词的全部历史
- \(w_{k-n+1}^{k-1}\)：从第 \(k-n+1\) 个词到第 \(k-1\) 个词，即当前词前面的 **n-1 个词**

### 常见疑问澄清

| 错误写法 | 问题 |
|---|---|
| \(P(w_k \mid w_{n-k+1}^{k-1})\) | 下标混乱，\(n\) 与 \(k\) 混用，含义不清 |
| \(P(w_k \mid w_{n-k+1}^{n-1})\) | 下标没有正确反映“前面的 n-1 个词” |

### 示例

句子：`I love natural language processing`

计算 `processing` 的概率（trigram，n=3）：

\[
P(\text{processing} \mid \text{natural, language})
\]

这里 \(k=5\)，所以 \(w_{k-2}^{k-1} = w_3^4 = \text{natural, language}\)。

---

## 二、条件概率的严格定义

### 条件概率公式

\[
P(A \mid B) = \frac{P(A \cap B)}{P(B)}
\]

在语言模型中：

\[
P(w_k \mid w_1^{k-1}) = \frac{P(w_1^{k-1}, w_k)}{P(w_ 1^{k-1})}
\]

### 为什么 \(P(w_1^{k-1}, w_k) = P(w_1^k)\)？

因为：

\[
(w_1^{k-1}, w_k) = (w_1, w_2, \dots, w_{k-1}, w_k) = w_1^k
\]

所以：

\[
P(w_k \mid w_1^{k-1}) = \frac{P(w _1 ^k)}{P(w_ 1^{k-1})}
\]

### 举例

\(k=3\)，序列 \((A, B, C)\)：

\[
P(C \mid A, B) = \frac{P(A, B, C)}{P(A, B)}
\]

这正是：

\[
\frac{P(w _1^3)}{P(w_ 1^2)}
\]

---

## 三、n-gram 的近似计算

### 为什么需要近似？

严格计算 \(P(w_1^k)\) 和 \(P(w_1^{k-1})\) 需要整个历史，长序列中计算量太大。

### 马尔可夫假设

\[
P(w_k \mid w_1^{k-1}) \approx P(w_k \mid w_{k-n+1}^{k-1})
\]

即当前词 \(w_k\) 仅依赖前 **n-1 个词**。

### Bigram 示例（n=2）

\[
P(w_k \mid w_1^{k-1}) \approx P(w_k \mid w_{k-1})
\]

即当前词仅依赖前一个词。

---

## 四、最大似然估计（MLE）

### Bigram 概率计算

\[
P(w_k \mid w_{k-1}) = \frac{\text{count}(w_{k-1}, w_k)}{\text{count}(w_{k-1})}
\]

### N-gram 概率计算

\[
P(w_k \mid w_{k-n+1}^{k-1}) = \frac{\text{count}(w_{k-n+1}^k)}{\text{count}(w_{k-n+1}^{k-1})}
\]

其中：

- \(\text{count}(w_{k-n+1}^k)\)：n-gram \(w_{k-n+1}, \dots, w_k\) 在语料中出现的次数
- \(\text{count}(w_{k-n+1}^{k-1})\)：(n-1)-gram \(w_{k-n+1}, \dots, w_{k-1}\) 出现的次数

---

## 五、count 统计量详解

### 定义

\(\text{count}(w_k, w_{k-1})\) 表示 **二元组 \((w_{k-1}, w_k)\) 在训练语料库中出现的次数**。

### 示例

训练语料：

1. `I love NLP`
2. `I love Python`
3. `Python is great`

Bigram 统计：

| Bigram | count |
|---|---|
| (I, love) | 2 |
| (love, NLP) | 1 |
| (love, Python) | 1 |
| (Python, is) | 1 |
| (is, great) | 1 |

### 计算 Bigram 概率

\[
P(\text{NLP} \mid \text{love}) = \frac{\text{count}(\text{love}, \text{NLP})}{\text{count}(\text{love})} = \frac{1}{2}
\]

\[
P(\text{Python} \mid \text{love}) = \frac{\text{count}(\text{love}, \text{Python})}{\text{count}(\text{love})} = \frac{1}{2}
\]

---

## 六、扩展到高阶 n-gram

对于 n-gram 模型：

- \(\text{count}(w_{k-n+1}, \dots, w_k)\)：n 个词的连续序列在语料中的出现次数
- 例如 trigram：\(\text{count}(w_{k-2}, w_{k-1}, w_k)\) 统计三元组出现次数

---

## 七、关键点与局限性

### 关键点

- \(\text{count}(\cdot)\) 来自训练语料，语料越大，统计越可靠
- 未登录词（OOV）问题：如果测试时遇到语料中未出现的 n-gram（count=0），需要使用平滑技术（如 Laplace 平滑）避免零概率

### 局限性

- 高阶 n-gram（如 5-gram）需要极大语料才能可靠统计，否则会稀疏
- 马尔可夫假设忽略了更长距离的上下文依赖

---

## 八、总结

| 概念 | 公式 |
|---|---|
| 条件概率定义 | \(P(w_k \mid w_1^{k-1}) = \frac{P(w _1 ^k)}{P(w_ 1^{k-1})}\) |
| n-gram 近似 | \(P(w_k \mid w_1^{k-1}) \approx P(w_k \mid w_{k-n+1}^{k-1})\) |
| Bigram MLE | \(P(w_k \mid w_{k-1}) = \frac{\text{count}(w_{k-1}, w_k)}{\text{count}(w_{k-1})}\) |
| N-gram MLE | \(P(w_k \mid w_{k-n+1}^{k-1}) = \frac{\text{count}(w_{k-n+1}^k)}{\text{count}(w_{k-n+1}^{k-1})}\) |

**核心结论**：

1. n-gram 模型用 n-1 阶马尔可夫假设简化了条件概率计算。
2. 条件概率的严格定义 \(P(w_k \mid w_1^{k-1}) = P(w_1^k) / P(w_1^{k-1})\) 是正确的，但计算困难。
3. 实际中使用 MLE 和 count 统计量来估计 n-gram 概率。
4. count 统计量是 n-gram 模型的核心，语料规模决定模型质量。