NLP深入学习(六):n-gram 语言模型


0. 引言

前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》

1. 什么是 n-gram

n-gram 模型是自然语言处理(NLP)中的一种统计语言模型,它基于马尔可夫假设简化了文本序列的预测问题。在 n-gram 模型中,每个词或符号的概率依赖于它前面的 n-1 个词或符号组成的上下文。

基本概念:

  1. n值

    • n代表连续出现单词的数量。当 n=1 时,模型称为 unigram,仅考虑单个词项的概率。
    • 当n=2时,模型为 bigram,考虑前一个词来估计当前词的概率。
    • 以此类推,三元模型(trigram)考虑前两个词来估计第三个词的概率,四元模型(four-gram)考虑三个词等等。
  2. 概率计算

    • 对于给定的一个句子 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(wnw1,w2,...,wn1)
  3. 训练与应用

    • 训练过程中,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公众号:一个比特定乾坤

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值