NLP学习路线图(十六):N-gram模型

news2025/6/3 12:45:23

一、为何需要语言模型?概率视角下的语言本质

自然语言处理的核心挑战在于让机器“理解”人类语言。这种理解的一个关键方面是处理语言的歧义性、创造性和结构性。语言模型(Language Model, LM)为此提供了一种强大的数学框架:它赋予任何词序列一个概率,用以衡量该序列在真实语言中出现的可能性

1.1 语言模型的核心任务

  • 评估序列合理性:判断一个句子“The cat sat on the mat”是否比“Mat the on sat cat the”更像人话。

  • 预测下一个词:给定上文“I have a dream...”,预测下一个最可能出现的词(如“that”)。

  • 生成连贯文本:基于概率采样,逐步生成新的、语法语义合理的句子。

1.2 统计语言模型的兴起

在早期NLP中,基于规则的方法试图用语法书般的精确规则描述语言,但很快遇到瓶颈:人类语言充满例外、方言和动态变化,规则难以穷尽。统计语言模型应运而生,其核心理念是:

“一个词出现的可能性,可以由它在大量文本数据中出现的频率来估计。”

N-gram模型正是这一理念最直接、最成功的实现之一。


二、N-gram模型:概念与数学基础

2.1 核心定义

  • N-gram:指文本中连续出现的N个词(或符号)单元。例如:

    • Unigram (1-gram): ["the"], ["cat"], ["sat"]

    • Bigram (2-gram): ["the", "cat"], ["cat", "sat"]

    • Trigram (3-gram): ["the", "cat", "sat"]

  • N-gram语言模型:一个基于马尔可夫假设的统计模型,它假设一个词出现的概率仅依赖于它前面的有限个词(通常是N-1个)。这是对现实语言复杂依赖关系的一种简化,但实践证明非常有效。

2.2 数学建模:链式法则与马尔可夫假设

语言模型的目标是为整个词序列W = (w1, w2, ..., wm) 赋予概率P(W)。根据概率的链式法则:
P(W) = P(w1) * P(w2|w1) * P(w3|w1, w2) * ... * P(wm|w1, w2, ..., wm-1)

精确计算P(wm|w1, w2, ..., wm-1)需要知道所有可能的历史组合的概率,这在数据有限时几乎不可能。马尔可夫假设提供了简化方案:假设一个词的概率只依赖于前面有限的k个词。当k = N-1时,我们得到N-gram模型

P(wm|w1, w2, ..., wm-1) ≈ P(wm|wm-N+1, wm-N+2, ..., wm-1)

因此,序列概率近似为:
P(W) ≈ Π P(wi|wi-N+1, ..., wi-1)

2.3 概率估计:最大似然估计(MLE)

模型参数P(wi|wi-N+1, ..., wi-1)如何获得?最直观的方法是在大型训练语料库中计数

P(wi | wi-N+1, ..., wi-1) = Count(wi-N+1, ..., wi-1, wi) / Count(wi-N+1, ..., wi-1)

  • Count(wi-N+1, ..., wi-1, wi):特定N-gram序列在语料中出现的次数。

  • Count(wi-N+1, ..., wi-1):该序列的历史上下文(前N-1个词)出现的次数。

示例: 在语料“the cat sat on the mat”中:

  • P(sat | the cat) = Count(the cat sat) / Count(the cat) = 1 / 1 = 1.0

  • P(mat | on the) = Count(on the mat) / Count(on the) = 1 / 1 = 1.0

三、构建N-gram模型:从数据到应用

3.1 训练流程

  1. 数据收集与预处理:收集大规模、领域相关的文本数据。进行分词、去除标点/数字(可选)、统一大小写、处理OOV词(如替换为<UNK>)。

  2. 计数统计:扫描语料,统计所有1-gram, 2-gram, ..., N-gram的出现频次。通常使用高效的数据结构(如哈希表、前缀树)。

  3. 概率计算:应用MLE公式计算所有条件概率P(wi | context)

  4. 平滑处理(关键!):处理零概率问题(见下一节)。

  5. 模型存储:存储计算好的概率表(通常很大,需优化)。

3.2 解码与应用:预测与生成

  • 下一个词预测:给定上下文(wi-N+1, ..., wi-1),查找概率P(w | wi-N+1, ..., wi-1)最大的词w

  • 序列概率评估:利用链式法则计算整个序列的概率(通常取对数避免下溢)。

  • 文本生成

    1. 给定起始词(或<S>标记)。

    2. 基于当前上下文(最后N-1个词),根据概率分布P(w | context)采样下一个词。

    3. 将采样词加入序列,更新上下文。

    4. 重复步骤2-3,直到生成结束标记</S>或达到长度限制。

四、挑战与对策:平滑技术详解

MLE估计的最大问题是数据稀疏性:语料库再大,也无法覆盖所有可能的N-gram组合。未在训练集中出现的N-gram(零频问题)会直接导致概率为零,进而使整个序列的概率为零,这显然不合理。平滑(Smoothing) 技术通过“劫富济贫”来解决此问题。

4.1 核心思想

  • 为所有可能的N-gram(即使未出现)分配非零概率。

  • 从高频N-gram的概率中“借”一小部分,分配给低频或零频N-gram。

  • 确保所有概率之和为1。

4.2 常用平滑方法

  1. 加一平滑(拉普拉斯平滑)

    • 最简单直观。

    • 公式:P(wi | wi-N+1, ..., wi-1) = (Count(wi-N+1, ..., wi-1, wi) + 1) / (Count(wi-N+1, ..., wi-1) + V)

    • V:词汇表大小。

    • 优点:实现简单。

    • 缺点:对高频N-gram概率削减过多;对于大N或大V,分配的概率太小,效果常不理想。

  2. 加K平滑(Lidstone平滑)

    • 加一平滑的推广,加一个小的常数k(0 < k < 1)。

    • 公式:P = (Count + k) / (Count_Context + k * V)

    • 通过调整k可以在偏差和方差间取得平衡。

  3. 古德-图灵估计(Good-Turing)

    • 更智能的平滑。核心思想:用观察到的出现r次的N-gram数量,来估计出现r次的事物的总概率质量,并将其分配给未出现(r=0)的事物

    • 计算调整频次:r* = (r+1) * N(r+1) / N(r),其中N(r)是出现r次的N-gram类型数。

    • 将频次为0的N-gram概率估计为:P = N(1) / NN是总token数)。

    • 优点:理论基础坚实,效果较好。

    • 缺点:计算复杂,需统计所有频次N(r);对于高频r,N(r)可能为0或不稳定。

  4. 回退(Backoff)

    • 核心思想:如果一个高阶N-gram(如trigram)没有数据,就“回退”到低阶N-gram(如bigram或unigram)的估计。

    • 条件:通常仅在Count(HighOrderNgram) = 0时触发回退。

    • 概率分配:高阶概率为0时,使用低阶概率乘以一个回退权重αα < 1),以确保总概率质量守恒。

    • 公式(以trigram回退到bigram为例):

      P(wi | wi-2, wi-1) = {
          Count(wi-2, wi-1, wi) / Count(wi-2, wi-1)   if Count(wi-2, wi-1, wi) > 0
          α(wi-2, wi-1) * P(wi | wi-1)               otherwise
      }
    • 权重计算α需要精心设计,保证在wi-2, wi-1条件下,所有词的概率和为1。

  5. 插值(Interpolation)

    • 核心思想:无论高阶N-gram是否存在数据,总是将不同阶(unigram, bigram, trigram, ...)的估计混合起来。

    • 公式(以trigram插值为例):
      P(wi | wi-2, wi-1) = λ1 * P(wi) + λ2 * P(wi | wi-1) + λ3 * P(wi | wi-2, wi-1)

    • 约束λ1 + λ2 + λ3 = 1λi >= 0

    • 优点:更鲁棒,即使高阶gram有数据,低阶gram也能提供有价值信息,防止过拟合。

    • 权重学习λ参数通常通过在留存数据集(held-out data)上优化模型困惑度(Perplexity)来学习。

  6. Kneser-Ney平滑

    • 被广泛认为是效果最佳的N-gram平滑方法之一,结合了回退和绝对折扣的思想。

    • 核心创新(主要在unigram概率上):

      • 延续概率(Continuation Probability):低阶模型(如unigram)不再仅基于词频,而是考虑一个词出现在不同上下文类型中的多样性

      • 公式(以bigram Kneser-Ney为例):

        P_KN(wi | wi-1) = max(Count(wi-1, wi) - D, 0) / Count(wi-1)  + λ(wi-1) * P_Continuation(wi)
        P_Continuation(wi) = |{v: Count(v, wi) > 0}| / |{(u, v): Count(u, v) > 0}|
      • D:折扣常数(通常0.75左右)。

      • λ(wi-1):归一化因子,保证概率和为1。

      • P_Continuation(wi):衡量wi作为新上下文“接续词”的能力。想象“Francisco”在“San Francisco”中频率高,但单独作为接续词能力弱(主要接在“San”后);而“cup”则可能出现在“coffee cup”, “world cup”等多种上下文中,其P_Continuation较高。

    • 优点:显著提高了对低频词和未知上下文的建模能力。

    • 变种:Modified Kneser-Ney (MKN) 使用多个折扣值(对不同频次)。

下表总结了主要平滑方法的比较:

平滑方法核心思想优点缺点适用场景
加一(拉普拉斯)所有计数+1实现极其简单高频项概率削减过多,效果常不佳教学示例,快速原型
加K平滑所有计数 + k (0<k<1)比加一灵活,可调参数k值选择需经验或优化,高频项仍被削对简单加一的改进
古德-图灵用出现r次类型数估计r*概率理论基础好,对零频项估计合理计算复杂,高频估计不稳定需要较好理论基础的中小模型
回退高阶无数据时回退到低阶直觉清晰,实现相对直接权重设计复杂,仅高阶缺失时才用低阶资源受限,需显式回退逻辑
插值混合不同阶模型,加权平均更鲁棒,充分利用各级信息需学习权重参数,计算开销稍大追求最佳效果的通用场景
Kneser-Ney折扣+回退+独特接续概率公认效果最好实现最复杂,计算开销最大对性能要求高的生产系统

五、N-gram模型的应用场景

尽管相对“传统”,N-gram模型凭借其高效、简单和可解释性,在众多场景中仍有一席之地,或作为更复杂系统的组件:

  1. 文本输入法

    • 核心应用!基于用户输入的前几个词(或拼音音节),预测下一个最可能的候选词。

    • Bigram/Trigram模型在此任务上非常高效且有效。

    • 例如:输入“wo xiang”,模型基于“我想”的历史,高概率预测“吃”、“要”、“买”等词。

  2. 拼写检查与语法纠错

    • 检测低概率词序列。句子“I are a student”中“I are”的bigram概率会极低,触发错误警报。

    • 结合词典和混淆集,用于建议纠正(如“are”-> “am”)。

  3. 语音识别

    • 声学模型识别出多个可能的词序列候选。

    • 语言模型(通常是trigram或更高阶)用于评估哪个词序列在语言上更“合理”,对识别结果进行重排序。如“recognize speech” vs. “wreck a nice beach”。

  4. 机器翻译(早期统计机器翻译SMT)

    • SMT的核心组件之一(与翻译模型配合)。用于评估翻译输出的目标语言流畅度。

    • 生成的目标语言句子概率越高,通常意味着越流畅自然。

  5. 信息检索

    • 查询扩展:利用同文档/相关文档中的高频共现词(N-gram)扩展用户原始查询。

    • 文档排序:部分早期模型(如查询似然模型)将文档视为语言模型生成查询的概率源,N-gram是其基础。

    • 相关性反馈:根据相关文档中的显著N-gram调整查询。

  6. 文本分类与情感分析

    • 将N-gram(特别是unigram和bigram)作为强大的文本特征。

    • 分类器(如Naive Bayes, SVM)学习不同类别(如体育/财经/娱乐;正面/负面)下N-gram特征的分布差异。

    • 例如:“暴跌”、“涨停”、“市盈率”等bigram在财经类中概率高;“进球”、“射门”、“点球”在体育类中概率高。

  7. 生物信息学(DNA/蛋白质序列分析)

    • 将生物序列(A/T/C/G 或 氨基酸)视为“文本”。

    • N-gram模型用于识别保守序列模式、基因预测、序列比对等。

 

六、N-gram的局限性与现代NLP中的演变

6.1 固有局限性

  1. 数据稀疏性:核心挑战,催生了平滑技术,但问题无法根除。长尾N-gram难以准确建模。

  2. 上下文窗口有限(马尔可夫假设):只能捕捉局部依赖(N-1词),无法建模长距离依赖(如主谓一致跨越从句)。例如:“The keys to the cabinet are on the table” vs. “The key to the cabinets is...”。

  3. 缺乏语义理解:基于共现统计,无法真正理解词义、语义角色、逻辑关系。无法处理同义(“buy/purchase”)、反义(“hot/cold”)或隐喻。

  4. 维度灾难:N增大时,可能的N-gram组合数量呈指数级增长(O(V^N)),导致存储和统计需求爆炸。实践中N很少超过5。

  5. 领域依赖性:在特定领域语料上训练的N-gram模型,移植到其他领域效果会显著下降(词汇、表达方式不同)。

6.2 现代NLP中的传承与演变

尽管有局限,N-gram的思想并未消亡,而是以不同形式融入现代NLP:

  1. 神经语言模型的基础

    • Bengio在2003年提出的前馈神经网络语言模型是神经语言模型的先驱。它使用词嵌入表示词,并通过神经网络学习P(wi | wi-1, ..., wi-n+1)。它突破了离散表示和手工特征的局限,但仍基于固定窗口(N-gram)上下文。这直接启发了后来的RNN/LSTM/Transformer。

  2. 子词单元(Subword Units)

    • 现代模型(如BERT, GPT)普遍采用Byte Pair Encoding (BPE), WordPiece, Unigram LM等算法将词分割为更小的子词单元(如"un", "##able", "ization")。

    • 这些子词单元本身可以看作是一种动态的、数据驱动的“N-gram”或字符组合,有效缓解了OOV问题和数据稀疏性,同时允许模型学习词素级别的规律。

  3. Transformer中的局部注意力(有时)

    • 虽然Transformer的自注意力机制原则上可以捕获任意长距离依赖,但为了提高效率或引入归纳偏置,有时会使用受限(窗口)注意力。例如:

      • 局部窗口注意力:只关注当前位置前后固定窗口内的词(如邻居100个词),这本质上是在学习一种软化的、基于上下文的N-gram模型

      • 稀疏注意力模式(如Longformer, BigBird):包含局部窗口注意力作为其模式的一部分。

    • 这些设计表明,局部依赖关系(N-gram的核心)在语言中仍然至关重要,并且高效捕获它们仍然有价值

  4. 特征工程的基石

    • 在深度学习模型中,N-gram特征(尤其是unigram, bigram)仍然常被作为输入特征或与神经网络的输出拼接,为模型提供显式的、强局部信号。例如,在文本分类或简单序列标注任务中,N-gram特征结合神经网络能取得很好效果。

  5. 轻量级解决方案与基线

    • 在资源受限(如嵌入式设备、低延迟场景)或数据量不大的任务中,平滑良好的N-gram模型因其极高的效率、低计算开销和易于部署的特点,仍然是可行的选择

    • 它也是评估更复杂模型进步的重要基线。如果一个强大的神经模型在某个任务上无法显著超越精心调优的N-gram模型,可能意味着任务本身特性或模型设计存在问题。

结语:历久弥新的N-gram

N-gram模型,作为统计语言模型的典范,以其简洁、高效和强大的可解释性,在NLP发展史上写下了浓墨重彩的一笔。它教会我们:

  1. 概率是处理语言不确定性的有力工具

  2. 局部上下文蕴含巨大信息

  3. 数据驱动是解决复杂语言问题的有效途径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python训练第四十天

DAY 40 训练和测试的规范写法 知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 昨天我们介绍…

InternVL2.5-多模态大模型评估专业图片

具备图像理解功能的大模型InternVL2.5&#xff0c;能有效解析大部分图片。 对于专业图片如医学细胞切片&#xff0c;从专业角度解析&#xff0c;能推动模型应用到更广泛的领域。 InternVL2.5解析示例 prompt(胸部癌变细胞图片,来自PanNuke) 请评估这个组织的风险 InternVL2.…

医疗数理范式化:从范式迁移到认知革命的深度解析

引言 在当代医疗领域,数理思维已经从辅助工具逐渐发展成为核心决策支持系统的关键组成部分。随着数字技术的迅猛发展,医疗行业正经历着前所未有的变革,而数理思维作为这一变革的核心驱动力,正在深刻重塑医疗实践的方方面面。数理思维在医疗领域的应用,本质上是将抽象的数…

图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析

现代信息检索系统和搜索引擎普遍采用两阶段检索架构&#xff0c;在人工智能应用中也被称为检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;。在初始检索阶段&#xff0c;系统采用高效的检索方法&#xff0c;包括词汇检索算法&#xff08;如BM25&…

现代数据湖架构全景解析:存储、表格式、计算引擎与元数据服务的协同生态

本文全面剖析现代数据湖架构的核心组件,深入探讨对象存储(OSS/S3)、表格式(Iceberg/Hudi/Delta Lake)、计算引擎(Spark/Flink/Presto)及元数据服务(HMS/Amoro)的协作关系,并提供企业级选型指南。 一、数据湖架构演进与核心价值 数据湖架构演进历程 现代数据湖核心价…

全志F1c200开发笔记——移植Debian文件系统

1.搭建环境 sudo apt install qemu-user-static -y sudo apt install debootstrap -y mkdir rootfs 2.拉取文件系统 这边我参照墨云大神的文档&#xff0c;但是华为镜像已经没有armel了&#xff0c;我找到了官方仓库&#xff0c;还是有的&#xff0c;拉取速度比较慢 sudo d…

支持功能安全ASIL-B的矩阵管理芯片IS32LT3365,助力ADB大灯系统轻松实现功能安全等级

随着自动驾驶技术的快速发展&#xff0c;汽车前灯智能化也越来越高。自适应远光灯 (ADB) 作为一种智能照明系统&#xff0c;在提升驾驶安全性和舒适性方面发挥着重要作用。ADB 系统通过摄像头和传感器获取前方道路信息&#xff0c;例如来车的位置、距离和速度&#xff0c;并根据…

BFS入门刷题

目录 P1746 离开中山路 P1443 马的遍历 P1747 好奇怪的游戏 P2385 [USACO07FEB] Bronze Lilypad Pond B P1746 离开中山路 #include <iostream> #include <queue> #include <cstring> using namespace std; int n; int startx, starty; int endx, endy; …

UE5 编辑器工具蓝图

文章目录 简述使用方法样例自动生成Actor&#xff0c;并根据模型的包围盒设置Actor的大小批量修改场景中Actor的属性&#xff0c;设置Actor的名字&#xff0c;设置Actor到指定的文件夹 简述 使用编辑器工具好处是可以在非运行时可以对资源或场景做一些操作&#xff0c;例如自动…

数据仓库分层 4 层模型是什么?

企业每天都在产生和收集海量数据。然而&#xff0c;面对这些数据&#xff0c;许多企业却陷入了困境&#xff1a;如何高效管理、处理和分析这些数据&#xff1f;如何从数据中提取有价值的信息来支持业务决策&#xff1f;这些问题困扰着众多数据分析师和 IT 管理者。 在众多架构…

基于亚博K210开发板——物体分类测试

开发板 亚博K210开发板 实验目的 本次测试主要学习 K210 如何物体分类&#xff0c;然后通过 LCD 显示屏实时显示当前物体的分类名称。本节采用百度出的 PaddlePaddle 平台开发。 实验元件 OV2640 摄像头/OV9655 摄像头/GC2145 摄像头、LCD 显示屏 硬件连接 K210 开发板…

什么是缺页中断(缺页中断详解)

文章目录 【操作系统】什么是缺页中断&#xff08;缺页中断详解&#xff09;一、缺页中断的本质与背景1. **虚拟内存与分页机制**2. **缺页中断的定义** 二、缺页中断的触发场景1. **首次访问新分配的虚拟页**2. **内存置换导致的页缺失**3. **访问权限冲突**4. **页表项无效**…

【echarts】仪表盘

<div style"width:50%;height:33%"><Yibiaopan echart_id"ybpChart2" :series_data"gaugeData2" title"火电" unit"MWh" :colorList"[#DFA58F,#F89061,#FF8E59]" /></div> 链接&#xff1a;ht…

java27

1.IO流 FileOutPutStream字节输出流基本用法&#xff1a; 一次性写入一个字符串的内容&#xff1a; 注意&#xff1a;\r或者\n表示把普通的r或者n的字符转义成回车的意思&#xff0c;所以不需要\\ FileInputStream字节输入流基本用法 -1在ASCII码里面对应的符号&#xff1a; 不…

OpenFeign和Gateway集成Sentinel实现服务降级

目录 OpenFeign集成Sentinel实现fallback服务降级cloud-alibaba-payment8003(支付服务)cloud-common-api(通用模块)cloud-alibaba-order9003(订单服务)Sentinel配置流控规则测试结果 Gateway集成Sentinel实现服务降级cloud-gateway9527(网关)测试结果 总结 OpenFeign集成Sentin…

CS144 - LAB0

CS144 - Lab 0 telnet 发送请求 如图&#xff0c;很简单&#xff0c;但是注意输入时间太久会超时 发邮箱 首先我们需要用命令行去发邮箱&#xff0c;这里我用企业微信邮箱给自己的 qq 邮箱发送~ 整个命令如下&#xff01; 对于其中的参数&#xff0c;其实从英文就可以看出来…

论文浅尝 | 将复杂知识图谱问答对齐为约束代码生成(COLING2025)

笔记整理&#xff1a;康家溱&#xff0c;东南大学在读硕士&#xff0c;研究方向为代码大语言模型 论文链接&#xff1a;https://aclanthology.org/2025.coling-main.267.pdf 发表会议&#xff1a;COLING 2025 1. 动机 近年来&#xff0c;随着大语言模型&#xff08;LLM&#xf…

Golang|分布式搜索引擎中所使用到的设计模式

迭代器模式 定义&#xff1a;在遍历接口时&#xff0c;提供统一的方法函数供调用&#xff0c;保持一致性。核心思想&#xff1a;与大众习惯保持一致&#xff0c;方便第三方实现容器类时保持一致。常见方法&#xff1a;如next()方法&#xff0c;适用于所有集合类&#xff0c;简化…

Ubuntu22.04通过命令行安装qt5

环境&#xff1a; VMware17Pro ubuntu-22.04.5-desktop-amd64.iso 步骤&#xff1a; 安装好虚拟机进入shell&#xff0c;或通过ssh登录&#xff0c;确保虚拟机能上外网&#xff0c;执行命令&#xff1a; sudo apt update sudo apt install build-essential sudo snap in…

STM32:ESP8266 + MQTT 云端与报文全解析

知识点1【MQTT的概述】 1、概述 MQTT是一种基于发布/订阅模式的轻量级应用层协议&#xff0c;运行在TCP/IP协议之上&#xff0c;专用物联网&#xff08;IoT&#xff09;和机器对机器&#xff08;M2M&#xff09;设计&#xff0c;其核心目标是低带宽&#xff0c;高延迟或不稳定…