0. 引言
前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
1. 什么是 n-gram
n-gram 模型是自然语言处理(NLP)中的一种统计语言模型,它基于马尔可夫假设简化了文本序列的预测问题。在 n-gram 模型中,每个词或符号的概率依赖于它前面的 n-1 个词或符号组成的上下文。
基本概念:
-
n值:
- n代表连续出现单词的数量。当 n=1 时,模型称为 unigram,仅考虑单个词项的概率。
- 当n=2时,模型为 bigram,考虑前一个词来估计当前词的概率。
- 以此类推,三元模型(trigram)考虑前两个词来估计第三个词的概率,四元模型(four-gram)考虑三个词等等。
-
概率计算:
- 对于给定的一个句子
T
=
w
1
,
w
2
,
.
.
.
,
w
n
T = w1, w2, ..., wn
T=w1,w2,...,wn,n-gram 模型通过条件概率链式规则估计整个句子的概率:
P ( T ) = P ( w 1 ) ∗ P ( w 2 ∣ w 1 ) ∗ P ( w 3 ∣ w 1 , w 2 ) ∗ . . . ∗ P ( w n ∣ w 1 , w 2 , . . . , w n − 1 ) P(T) = P(w1) * P(w2|w1) * P(w3|w1,w2) * ... * P(wn|w1,w2,...,wn-1) P(T)=P(w1)∗P(w2∣w1)∗P(w3∣w1,w2)∗...∗P(wn∣w1,w2,...,wn−1)
- 对于给定的一个句子
T
=
w
1
,
w
2
,
.
.
.
,
w
n
T = w1, w2, ..., wn
T=w1,w2,...,wn,n-gram 模型通过条件概率链式规则估计整个句子的概率:
-
训练与应用:
- 训练过程中,n-gram模型通过分析大量文本语料库中的统计数据来估计这些条件概率。
- 应用场景包括语音识别、机器翻译、拼写纠正、自动补全等,其中模型用于预测下一个最可能出现的词汇。
2. 代码示例
以下是一个简单的Python示例,展示如何使用 n-gram 模型计算一个文本序列的概率(这里以bigram为例):
import numpy as np
# 假设我们有一个预处理过的单词列表
corpus = ['I', 'am', 'a', 'language', 'model', '.']
vocab = set(corpus)
# 初始化bigram计数字典
bigram_counts = {}
# 计算bigram频率
for i in range(len(corpus)-1):
current_bigram = (corpus[i], corpus[i+1])
bigram_counts[current_bigram] = bigram_counts.get(current_bigram, 0) + 1
# 总的bigram数量
total_bigrams = sum(bigram_counts.values())
# 创建平滑后的概率字典(简单地对每个bigram加上1来避免零概率问题)
bigram_probabilities = {bigram: (count + 1) / (total_bigrams + len(vocab)) for bigram, count in bigram_counts.items()}
# 计算句子的概率(假设句子是'I am a language model .')
sentence = 'I am a language model .'.split()
probability = 1.0
# 计算给定句子的概率
for i in range(len(sentence)-1):
current_bigram = (sentence[i], sentence[i+1])
probability *= bigram_probabilities.get(current_bigram, 1e-10) # 使用一个较小的值作为默认概率防止除以零
print("Sentence probability:", probability)
这个例子非常基础,仅用于说明 n-gram 模型的基本思想。实际应用中,通常需要处理大量数据,并且会使用更复杂的平滑方法和更高阶的n-gram模型。此外,在现代 NLP 任务中,神经网络语言模型如 RNN、LSTM 或 Transformer 已经取代了传统的统计 n-gram 模型,提供了更好的性能。
3. 局限性
n-gram 模型的一个主要问题是数据稀疏性,尤其是在n较大时,某些特定顺序的 n-gram 可能在训练集中未出现过,导致无法准确估计其概率。另一局限性是马尔可夫假设本身的简化性质,即认为当前词只与其前面有限个词相关,忽略了更远距离的上下文信息。
为了克服这些问题,后续研究引入了平滑技术(如拉普拉斯平滑、古德图灵平滑等),以解决零概率问题。随着深度学习的发展,神经网络语言模型如RNN和Transformer逐渐取代了传统的n-gram模型,在捕捉长距离依赖关系上表现出色。但即便如此,n-gram模型仍然是理解和构建复杂语言模型的基础,并且在许多实际应用场景中仍具有重要价值。
4. 参考
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
也欢迎关注我的wx公众号:一个比特定乾坤