郭震 AI公众号:郭震AI

14 从零学NLP系列教程:只生成语言模型之N-gram模型

发布日期:

最近更新:

分类: NLP小白

预计阅读: 4 分钟

阅读次数: 0

预计阅读4 分钟
结构重点6 个
图文要点6 张
正文规模1.6k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 6 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

N-gram 语言模型流程图查看大图
Ngram 语言模型流程图

N-gram 用局部历史估计下一个词,是理解语言模型的经典起点。它简单直观,也清楚暴露了上下文短和稀疏的问题。

N-gram 语言模型实操核对图查看大图
Ngram 语言模型实操核对图

我会改变 n 值并比较困惑度和生成样例。只看公式,不看输出文本,很难理解模型限制。

在前一篇的教程中,我们探讨了词向量模型中的GloVe,其核心是将词语映射到高维空间中,使得词语之间的相似性能够通过向量之间的距离来体现。而在这一篇中,我们将关注于生成语言模型,具体来说是N-gram模型。N-gram模型是一种简单而有效的方法,用于文本生成、语言建模和许多NLP任务中。

什么是N-gram模型?

N-gram模型是一种基于统计的语言模型,它通过观察连续的n个词(或符号)来预估下一个词出现的概率。N-gram中的n代表了模型的阶数,例如:

N-gram语言模型判断卡查看大图
Ngram语言模型判断卡

学习 N-gram 语言模型时,先看词序列、条件概率、平滑方法、上下文长度和数据稀疏。

  • 1-gram(unigram):只考虑单个词
  • 2-gram(bigram):考虑连续的两个词
  • 3-gram(trigram):考虑连续的三个词

模型的核心思想是:

P(wnwn1,wn2,,wnk)P(wnwn1,,wnn+1)P(w_n | w_{n-1}, w_{n-2}, \ldots, w_{n-k}) \approx P(w_n | w_{n-1}, \ldots, w_{n-n+1})

这意味着在预测下一个词时,模型只考虑前面n-1个词。

N-gram模型的构建

构建N-gram模型的过程通常包括以下步骤:

自然语言处理阅读地图卡查看大图
自然语言处理阅读地图卡

读《从零学NLP系列教程:只生成语言模型之N-gram模型》时,可以先看配图里的任务、概念、练习和判断点,再回到正文补细节。这样更容易判断这篇内容能放到哪个真实场景里。

  1. 文本预处理:清理文本数据,去除标点、转化为小写等。
  2. 生成N-gram:从文本中提取N-gram。
  3. 计算概率:基于统计原理计算每个N-gram的出现概率。

下面是一个简单的Python代码示例,展示如何从文本中生成bigram(2-gram)模型:

import nltk
from nltk import bigrams
from nltk.tokenize import word_tokenize
from collections import Counter

# 下载nltk数据包
nltk.download('punkt')

# 示例文本
text = "从零学NLP是一个非常有趣的旅程。学习语言模型是NLP中的重要部分。"

# 分词
tokens = word_tokenize(text)

# 生成bigrams
bigrams_list = list(bigrams(tokens))

# 计算频率
bigram_counts = Counter(bigrams_list)

# 计算概率
total_bigrams = sum(bigram_counts.values())
bigram_probabilities = {bigram: count / total_bigrams for bigram, count in bigram_counts.items()}

# 输出bigram概率
print(bigram_probabilities)

N-gram模型的优缺点

优点:

  • 简单易懂:模型简单,易于实现和理解。
  • 有效性:在文本生成等任务中,基于N-gram的模型训练可以快速有效地产生结果。

缺点:

  • 稀疏性:随着N的增加,可能会遇到许多未见过的N-gram(zero-frequency problem)。
  • 上下文限制:只考虑有限的上下文,可能无法捕捉长程依赖关系。

N-gram的应用案例

N-gram模型在诸多NLP任务中都有实际应用,比如:

从零学NLP系列教程:只生成语言模型之Ngram模型应用检查卡查看大图
从零学NLP系列教程:只生成语言模型之Ngram模型应用检查卡

如果想把《从零学NLP系列教程:只生成语言模型之Ngram模型》用到自己的任务里,可以先缩小场景,只验证一个最关键的判断点。

从零学NLP系列教程:只生成语言模型之Ngram模型应用复盘卡查看大图
从零学NLP系列教程:只生成语言模型之Ngram模型应用复盘卡

学完《从零学NLP系列教程:只生成语言模型之Ngram模型》后,不妨换一个自己的场景试一次,重点观察输入、处理和输出是否能对应起来。

  1. 自动文本生成:通过预测下一个词生成连贯的句子。
  2. 拼写纠错:基于上下文分析推测用户输入的词是否正确。
  3. 语音识别:帮助系统理解连续语音中各个词的可能性。

案例:简单的文本生成

下面是一个示例,展示如何使用已构建的bigram概率模型进行简单的文本生成:

import random

def generate_sentence(bigram_probs, start_word, num_words=10):
    current_word = start_word
    sentence = [current_word]

    for _ in range(num_words - 1):
        next_words = [bigram[1] for bigram in bigram_probs.keys() if bigram[0] == current_word]
        if not next_words:
            break  # 如果没有下一个词则结束生成
        probabilities = [bigram_probs[(current_word, next_word)] for next_word in next_words]
        next_word = random.choices(next_words, weights=probabilities)[0]
        sentence.append(next_word)
        current_word = next_word

    return ' '.join(sentence)

# 生成句子示例
start_word = '学习'
generated_sentence = generate_sentence(bigram_probabilities, start_word)
print("生成的句子:", generated_sentence)

通过调用generate_sentence函数,你可以看到基于当前模型生成的文本,这种方法简单直接,但在生成句子的连贯性和流畅性上存在一定局限。

总结

在这一篇中,我们详细介绍了N-gram模型的原理、构建过程以及应用案例。N-gram模型虽然简单,但它为语言模型的学习奠定了重要基础。接下来,在下一篇教程中,我们将探讨更为复杂的语言模型——RNN和LSTM,它们能够有效地捕捉更长距离的依赖关系,为文本生成和理解提供更强大的能力。希望你们继续关注这一系列教程!

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

从零学NLP系列教程:只生成语言模型之N-gram模型适合谁读?

这是 自然语言处理入门 系列第 14 / 30 篇,适合正在学习自然语言处理入门,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇自然语言处理入门教程要多久?

按中文技术文章阅读速度估算,通读大约 4 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...