前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
n-gram 模型是自然语言处理(NLP)中的一种统计语言模型,它基于马尔可夫假设简化了文本序列的预测问题。在 n-gram 模型中,每个词或符号的概率依赖于它前面的 n-1 个词或符号组成的上下文。
基本概念:
n值:
概率计算:
训练与应用:
以下是一个简单的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 模型,提供了更好的性能。
n-gram 模型的一个主要问题是数据稀疏性,尤其是在n较大时,某些特定顺序的 n-gram 可能在训练集中未出现过,导致无法准确估计其概率。另一局限性是马尔可夫假设本身的简化性质,即认为当前词只与其前面有限个词相关,忽略了更远距离的上下文信息。
为了克服这些问题,后续研究引入了平滑技术(如拉普拉斯平滑、古德图灵平滑等),以解决零概率问题。随着深度学习的发展,神经网络语言模型如RNN和Transformer逐渐取代了传统的n-gram模型,在捕捉长距离依赖关系上表现出色。但即便如此,n-gram模型仍然是理解和构建复杂语言模型的基础,并且在许多实际应用场景中仍具有重要价值。
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
也欢迎关注我的wx公众号:一个比特定乾坤