文章目录
在自然语言处理(NLP)的发展历程中,基础语言模型是构建复杂任务的基石。无论是早期的文本分类、机器翻译,还是如今大模型的预训练,都能看到N-Gram模型和Bag-of-words词袋模型的影子。本文将从这两个经典模型出发,深入剖析其核心技术原理、相关支撑技术及适用场景,为理解更复杂的语言模型奠定基础。
一、N-Gram模型:基于序列统计的语言建模先驱
N-Gram模型是一种基于统计的语言模型,其核心思想是通过对文本中相邻词语序列的统计分析,来估算句子的概率分布。它虽结构简单,但在NLP发展初期发挥了至关重要的作用,至今仍在部分场景中被广泛应用。要理解N-Gram模型,首先需要掌握其理论基础------香农熵。
(1)香农熵:衡量语言不确定性的核心指标
香农熵由信息论创始人克劳德·香农提出,用于衡量一个随机变量的不确定性程度。在语言模型中,香农熵可用来量化语言的"信息量":熵值越高,说明文本的不确定性越强,语言越复杂;熵值越低,说明文本的规律性越强,越容易被预测。
对于离散的语言符号集合(如单词、字符),假设其概率分布为P(x₁,x₂,...,xₙ),其中xᵢ表示第i个语言符号,那么该序列的香农熵H(X)定义为:H(X) = -ΣP(x)log₂P(x)。在实际应用中,由于直接计算整个语言序列的熵难度极大,通常会通过"条件熵"来简化------即给定前序符号的情况下,当前符号的不确定性。而N-Gram模型的核心,正是通过近似条件熵来降低语言建模的复杂度。
基于香农熵,我们还能衍生出"交叉熵"和"困惑度(Perplexity)"两个关键评估指标。交叉熵用于衡量模型预测分布与真实语言分布的差异,而困惑度则是交叉熵的指数形式,直接反映模型对文本的预测能力:困惑度越低,模型预测越准确。
简单来说:他认为,要衡量一句话的信息量,就要了解其中每个单词出现的概率。
(2)N-Gram原理:利用马尔可夫假设简化序列建模
N-Gram模型的核心假设是"马尔可夫假设":即文本中第n个词的出现概率,仅与前n-1个词相关,与更早期的词无关。这一假设大幅简化了语言序列的概率计算。
从定义来看,"N-Gram"中的"N"代表"相邻词语序列的长度"。根据N的不同,可分为以下几类:
-
Unigram(1-Gram):假设每个词的出现独立于其他词,即P(xₙ|x₁,...,xₙ₋₁) ≈ P(xₙ)。例如"我爱吃苹果"的概率约等于P(我)×P(爱)×P(吃)×P(苹果)。
-
Bigram(2-Gram):假设每个词的出现仅与前一个词相关,即P(xₙ|x₁,...,xₙ₋₁) ≈ P(xₙ|xₙ₋₁)。此时"我爱吃苹果"的概率约为P(我)×P(爱|我)×P(吃|爱)×P(苹果|吃)。
-
Trigram(3-Gram):假设每个词的出现与前两个词相关,即P(xₙ|x₁,...,xₙ₋₁) ≈ P(xₙ|xₙ₋₂,xₙ₋₁)。这是实际应用中最常用的N-Gram模型,平衡了预测精度和计算复杂度。
马尔可夫假设 第n个词概率仅依赖前n-1个词 N-Gram分类 Unigram(1-Gram):依赖自身 Bigram(2-Gram):依赖前1个词 Trigram(3-Gram):依赖前2个词 例:P(我爱吃苹果)= P(我)×P(爱)×P(吃)×P(苹果) 例:P(我爱吃苹果)= P(我)×P(爱我)×P(吃|爱)×P(苹果||吃) 实际应用最优,平衡精度与复杂度
N-Gram模型的概率估算主要依赖"最大似然估计(MLE)"。以Bigram为例,P(xᵢ|xᵢ₋₁)的估算公式为:P(xᵢ|xᵢ₋₁) = count(xᵢ₋₁,xᵢ) / count(xᵢ₋₁),其中count(·)表示该词语或词语序列在训练语料中的出现次数。
需要注意的是,当训练语料中未出现某个N元序列时,会导致概率为0的"数据稀疏问题"。为解决这一问题,通常会采用"平滑技术",如拉普拉斯平滑(对所有N元序列的计数加1)、卡茨平滑(用低阶N-Gram概率近似高阶概率)等。
(3)Token的概念、分词工具及NLP数据预处理技术
在讲解N-Gram模型的实际应用前,必须明确一个基础概念------Token,以及其相关的分词工具和数据预处理技术,这些是所有语言模型训练的前置步骤。
Token的概念:Token即"词元",是语言模型处理文本的基本单位。其形式灵活,可根据任务需求定义为单词、字符、子词(如BPE分词后的单元)等。例如,英文句子"I love NLP"按单词分词得到的Token为["I", "love", "NLP"];中文句子"我爱自然语言处理"按词语分词得到的Token为["我", "爱", "自然语言处理"],按字符分词则为["我", "爱", "自", "然", "语", "言", "处", "理"]。
分词工具简介:分词是将连续文本切分为Token的过程,不同语言的分词难度差异较大。英文等拼音文字天然以空格分隔,分词相对简单,常用工具如NLTK的word_tokenize、SpaCy的分词器等;中文无天然分隔符,需通过算法切分,主流工具包括:
-
jieba(结巴分词):国内最常用的中文分词工具,支持精确模式、全模式和搜索引擎模式,可自定义词典。
-
HanLP:基于深度学习的分词工具,支持多语言,分词精度高,同时提供词性标注、命名实体识别等配套功能。
-
THULAC(清华分词):由清华大学研发,兼顾分词速度和精度,适用于大规模文本处理。
NLP数据预处理技术:分词后还需进行一系列预处理,以提升模型效果,核心步骤包括:
-
去噪:去除文本中的无关信息,如HTML标签、特殊符号、标点符号(根据任务需求)等。
-
大小写转换:英文文本通常统一转为小写,避免"Love"和"love"被视为两个不同Token。
-
停用词去除:删除无实际语义的高频词,如中文的"的""是""在",英文的"the""a""is",可使用通用停用词表或自定义停用词表。
-
词性标注与词干提取:部分任务中需标注Token的词性(如名词、动词),英文可通过词干提取(如将"loving""loved"还原为"love")统一词形。
二、Bag-of-words词袋模型:忽略顺序的文本表示方法
与N-Gram模型关注文本序列不同,Bag-of-words(词袋模型)是一种"忽略词序、仅关注词频"的文本表示方法。它将文本视为一个"装满词语的袋子",通过统计每个词的出现次数来构建文本的数值向量,实现文本的量化表示。
(1)Bag-of-words词袋模型原理
词袋模型的核心思想是:文本的语义由其中包含的词语及其出现频率决定,词语的顺序对语义无影响。其构建过程可分为三步:
-
构建词表:收集所有训练文本中的不重复词语,形成一个固定长度的词表(Vocabulary),词表的大小即为向量的维度。例如,所有文本的不重复词为["我", "爱", "吃", "苹果", "香蕉"],则词表大小为5。
-
词频统计:对于每个文本,统计词表中每个词语在该文本中的出现次数。例如,文本"我爱吃苹果,我爱吃香蕉"中,各词的词频为["我":2, "爱":2, "吃":2, "苹果":1, "香蕉":1]。
-
构建向量:根据词频统计结果,将每个文本转化为一个与词表长度一致的向量,向量的每个元素对应词表中该词语的词频。上述例子的向量为[2, 2, 2, 1, 1]。
开始 步骤1:构建词表 收集所有文本不重复词,形成固定词表 步骤2:词频统计 统计单个文本中各词表词语的出现次数 步骤3:构建向量 按词表顺序将词频组合为数值向量 结束:得到文本的词袋向量 例:词表=[我,爱,吃,苹果,香蕉] 例:文本"我爱吃苹果,我爱吃香蕉"词频={我:2,爱:2,吃:2,苹果:1,香蕉:1} 例:向量=[2,2,2,1,1]
需要注意的是,词袋模型的向量维度通常较高(等于词表大小),且存在大量零值(稀疏向量)。为优化这一问题,可通过"词频-逆文档频率(TF-IDF)"对词频进行加权。TF-IDF综合考虑了词语在当前文本中的频率(TF)和在所有文本中的稀缺性(IDF),使得稀缺但对当前文本重要的词语获得更高权重,公式为:TF-IDF = TF × IDF,其中IDF = log(总文档数/包含该词的文档数+1)(加1避免分母为0)。
(2)如何使用Bag-of-words计算文本相似度
将文本转化为词袋向量后,可通过向量间的相似度计算来衡量文本间的语义相似度。常用的相似度计算方法有以下两种:
1. 余弦相似度(Cosine Similarity):衡量两个向量在高维空间中的夹角余弦值,取值范围为[-1,1],值越接近1,说明向量越相似。由于词袋向量的元素均为非负值,余弦相似度的取值范围可简化为[0,1]。其计算公式为:cos(θ) = (A·B) / (||A|| × ||B||),其中A·B为向量A和B的点积,||A||和||B||分别为向量A和B的L2范数(模长)。
计算逻辑 向量空间示意 点积A·B=2×1+2×1+2×1+1×2+1×2=12 计算模长||A||=√(2²+2²+2²+1²+1²)=√14 计算模长||B||=√(1²+1²+1²+2²+2²)=√11 cosθ=12/(√14×√11)≈0.97→高度相似 向量A:文本1=[2,2,2,1,1] 向量B:文本2=[1,1,1,2,2] 原点 OA=||A||=√14≈3.74 OB=||B||=√11≈3.32 夹角θ≈8°,cosθ≈0.97
示例:假设文本1的向量为[2,2,2,1,1],文本2的向量为[1,1,1,2,2],则点积为2×1 + 2×1 + 2×1 + 1×2 + 1×2 = 12;||A||=√(2²+2²+2²+1²+1²)=√14,||B||=√(1²+1²+1²+2²+2²)=√11,余弦相似度为12/(√14×√11)≈0.97,说明两文本高度相似。
2. 欧氏距离(Euclidean Distance):衡量两个向量在高维空间中的直线距离,距离越小,说明向量越相似。计算公式为:d(A,B) = √[Σ(Aᵢ - Bᵢ)²]。需要注意的是,欧氏距离受向量维度和数值大小影响较大,通常需先对向量进行归一化处理(如标准化、归一化到单位向量)。
与余弦相似度对比 欧氏距离示意 余弦相似度:关注方向一致性 欧氏距离:关注数值差异大小 词袋模型中:余弦相似度更常用,不受文本长度影响 原点 向量A:[2,2,2,1,1] 直线距离 距离d=√[(2-1)²+(2-1)²+(2-1)²+(1-2)²+(1-2)²]=√5≈2.24
在实际应用中,余弦相似度 因不受向量长度影响,是词袋模型计算文本相似度的首选方法,广泛用于文本检索、重复文本检测等任务。
三、N-Gram与Bag-of-words:优缺点及适用场景总结
N-Gram模型和Bag-of-words词袋模型作为NLP的基础技术,各有其独特的优势和局限性,适用场景也存在显著差异。下表对两者进行全面对比:
| 评估维度 | N-Gram模型 | Bag-of-words词袋模型 |
|---|---|---|
| 核心优势 | 1. 保留文本序列信息,能捕捉词语间的相邻依赖关系;2. 原理简单,训练速度快,可通过平滑技术缓解数据稀疏问题;3. 对短文本的概率预测效果较好。 | 1. 实现简单,计算效率高,易于理解和部署;2. 能有效捕捉文本的核心语义(基于词频);3. 结合TF-IDF后可突出关键词语的重要性。 |
| 主要缺点 | 1. 数据稀疏问题严重,N值越大,稀疏性越明显;2. 无法捕捉长距离依赖关系,仅关注相邻N个词;3. 模型规模随词表增大而膨胀,存储成本高。 | 1. 完全忽略词语顺序,丢失大量语义信息(如"我打他"和"他打我"向量相同);2. 对高维稀疏向量的处理成本较高;3. 无法区分词语的语义权重(未加权时)。 |
| 适用场景 | 1. 语言生成任务:如文本补全、机器翻译的解码阶段;2. 文本纠错:通过计算句子概率识别语法错误;3. 语音识别:将语音序列转化为文本时的概率预测。 | 1. 文本分类与聚类:如垃圾邮件检测、新闻分类;2. 文本检索:如关键词检索中的相关性排序;3. 情感分析(简单场景):结合词频和情感词典判断文本情感。 |
| 不适用场景 | 1. 长文本建模:无法捕捉长距离语义关联;2. 对语义理解要求高的任务:如问答系统、语义推理。 | 1. 需关注词序的任务:如机器翻译、文本生成;2. 语义歧义性高的任务:如指代消解、语义角色标注。 |
N-Gram模型和Bag-of-words词袋模型虽为早期语言建模技术,但它们构建了"文本量化表示"和"概率建模"的核心思想,是理解现代语言模型(如Transformer、BERT)的重要基础。N-Gram通过序列统计捕捉局部依赖,Bag-of-words通过词频实现简单高效的文本表示,两者分别从"顺序"和"频率"两个维度解读文本语义。
在实际应用中,需根据任务需求选择合适的模型:若关注文本序列和概率预测,优先选择N-Gram;若需简单高效地实现文本分类或检索,Bag-of-words是更优选择。同时,两者的局限性也推动了后续技术的发展------为解决长距离依赖问题,出现了循环神经网络(RNN);为解决词袋模型忽略语义的问题,出现了词嵌入(Word2Vec、GloVe)等技术。但无论技术如何迭代,这些基础模型的核心思想始终在NLP领域发挥着重要作用。