# Summary
**"gram"** 来自希腊语后缀 **"-gram"**,意思是 "写下来的东西" 或 "记录"
- 比如: telegram (电报), diagram (图表), program (程序)
**"N"** 就是数学中的变量,表示**数量**,所以 **N-gram = "N个单位的序列"**,是一种将文本分解成连续 N 个单元(词或字符)的方法。
# Cues
# Notes
N-gram 是一种将文本分解成连续 N 个单元(词或字符)的方法。让我用具体例子来说明:
## 词级别 N-gram
假设有句子:"我喜欢吃苹果"
- **1-gram (unigram)**:["我", "喜欢", "吃", "苹果"]
- **2-gram (bigram)**:["我 喜欢", "喜欢 吃", "吃 苹果"]
- **3-gram (trigram)**:["我 喜欢 吃", "喜欢 吃 苹果"]
## 字符级别 N-gram
以单词 "hello" 为例:
- **2-gram**:["he", "el", "ll", "lo"]
- **3-gram**:["hel", "ell", "llo"]
- **4-gram**:["hell", "ello"]
## 实际应用例子
### 1. 文本分类中的特征提取
```Java
原文:"这部电影真的很好看"
2-gram特征:["这部 电影", "电影 真的", "真的 很", "很 好看"]
```
这些 n-gram 可以捕捉词语搭配信息,比如"很好看"比单独的"很"和"好看"更有意义。
### 2. FastText 中的子词 N-gram
```Java
单词:"apple"
3-gram:["<ap", "app", "ppl", "ple", "le>"]
(< 和 > 表示词的开始和结束)
```
这样即使遇到未见过的词 "apples",也能通过共享的 n-gram(如 "app", "ppl")获得相似的表示。
### 3. 语言模型预测
```Java
已知文本:"今天天气"
使用 3-gram 模型,可能预测:
- "今天 天气" → "很好"(出现频率高)
- "今天 天气" → "不错"(出现频率中)
- "今天 天气" → "真冷"(出现频率低)
```
## N-gram 的优缺点
**优点**:
- 简单有效,能捕捉局部上下文信息
- 计算效率高
- 对于短文本分类效果好
**缺点**:
- N 增大时,可能的组合数呈指数增长(数据稀疏问题)
- 只能捕捉固定长度的上下文
- 无法理解长距离依赖关系
这就是为什么 FastText 使用字符级 n-gram 来增强词向量表示——既保持了效率,又能处理未见过的词。
## 避免 N-gram 重复 (no_repeat_ngram_size)
**通俗理解:** 禁止出现**连续N个词完全相同**的片段。
**例子 (no_repeat_ngram_size=3):**
```Java
已生成: "北京是中国的首都"
禁止再出现: "是中国的" 这个3-gram
```
**效果:**
- `no_repeat_ngram_size=2`: 防止"的的"、"了了"这种2字重复
- `no_repeat_ngram_size=3`: 防止短语级别的重复
- 常用值是 2-4