2.1概念
N-gram是自然语言处理的一种统计模型,用于捕捉词序之间的概率特性。
原理:N-gram通过在文本上应用大小为N的滑动窗口,并以词元(token)为单位对文本进行划分,从而产生长度为N的词序列,称之为gram。在该模型中,第N个词出现的概率仅与它前面N-1个词有关。因此一个句子的概率是由其组成的各词元的概率乘积得到的。
目标:基于前N-1个词预测下一个词出现的概率
在N-gram中,N代表连续词的数量。例如,
Unigram (N=1):每个词的概率独立于其他词,仅考虑单个词的频率。
Bigram (N=2):考虑两个连续词之间的关系,预测下一个词时只依赖于前一个词。
Trigram (N=3):考虑三个连续词之间的关系,预测下一个词时依赖于前两个词。
2.2Bigram原理
现在我们根据一段现实中的具体文本来理解以下Bigram的原理。
考虑一段简单的文本:"I love to play basketball and I also like soccer."
首先,我们将这段文本转换成一个个的词对(bigrams),包括句子开始和结束的标记(通常用 <s> 和 </s> 表示):
<s>, I
I, love
love, to
to, play
play, basketball
basketball, and
and, I
I, also
also, like
like, soccer
soccer, </s>
接下来,我们计算这些词对出现的频率,以构建我们的bigram模型。例如,如果我们想要知道在看到词 "I" 之后词 "love" 出现的概率,我们可以数一下在整个文本中 "I" 后面跟着 "love" 的次数,然后除以 "I" 出现的总次数。
在这个例子中,"I" 出现了两次,一次后面跟着 "love",一次后面跟着 "also"。所以 P(love | I) = 1/2 = 0.5。
同样的方法可以用来计算其他所有bigram的概率。当我们要使用这个模型去生成新的文本或者评估某个序列的可能性时,我们就根据这些概率来进行。
例如,如果我们想计算以下句子的概率:"I love soccer"
我们可以将它分解为bigrams:
<s>, I
I, love
love, soccer
soccer, </s>
然后使用之前计算的概率相乘得到整个句子的概率(实际上是log概率的和,以避免数值下溢)。
P(soccer)=P(I | <s>) P(love | I) P(soccer | love) P(</s> |soccer)
请注意,在实际应用中,我们会有一个更大的语料库用于训练bigram模型,这样可以得到更准确的概率估计。
2.3平滑
目标:解决数据稀疏性。在训练数据中,某些单词或短语可能从未出现过,或者其上下文信息不足,导致预测时出现零概率问题。此时我们引入平滑技术就可以为出现次数极少的单词或短语提供一个非零概率统计,让模型的预测结果更加准确合理。
2.3.1加一平滑
让我们通过一个具体的例子来解释加一平滑(Laplace Smoothing)。假设我们有一个非常小的训练语料库,里面包含了以下句子:
1. I like cats
2. I love dogs
3. They like cats
我们将这个语料库转换成bigram,并统计每个bigram出现的次数。为了简单起见,我们不考虑句子开始和结束的标记。
first world | second world | count |
I | like | 1 |
I | love | 1 |
like | cats | 2 |
love | dogs | 1 |
They | like | 1 |
在这个简单的语料库中,我们的词汇表 V 包含了6个不同的词:I, like, cats, love, dogs, They。
零概率现象:
如果我们想要计算 "like dogs" 这个bigram的概率,在未进行平滑的情况下,我们会发现它并没有出现在我们的训练数据中,因此它的概率是0。
P(dogs | like) = count(like, dogs) / count(like) = 0 / 2 = 0
加一平滑后的概率
应用加一平滑后,我们需要对每个bigram的计数增加1,并且分母需要增加词汇表大小V,因为每个词都得到了一个额外的计数。
对于bigram "like dogs",即使它在原始语料库中没有出现过,我们也会给它分配一个小但非零的概率:
P'(dogs | like) = (count(like, dogs) + 1) / (count(like) + V)
= (0 + 1) / (2 + 6)
= 1 / 8
其中like dogs在语料库中出现的次数为0,like 在语料库中出现的次数为2,V词汇表的大小为6
同样地,我们可以计算其他bigram的概率。比如 "I like" 的概率会变成:
P'(like | I) = (count(I, like) + 1) / (count(I) + V)
= (1 + 1) / (2 + 6)
= 2 / 8
= 1 / 4
一定要注意!!!不仅仅是对零概率的次序进行加一平滑,而是N-gram中的所有词都要进行平滑
2.3.2加k平滑
加k平滑的原理和加一平滑非常相似,对于分子我们增加K,分母增加V x K
2.3.3插值平滑
插值平滑结合了不同阶数的n-gram模型(如unigram, bigram, trigram等),根据一定的权重对它们进行线性组合。这样可以确保即使较高阶的n-gram不可用时,较低阶的n-gram也可以提供有用的信息。
2.3.4回退平滑
回退平滑也是一种常用的高级平滑方法,它规定当一个n-gram的频率不足以可靠估计其概率时,就回退到较低阶的n-gram模型。与插值不同的是,回退只在需要的时候才使用低阶模型。
这种回退是有条件的,只有高阶模型无法提供可靠信息时才会触发。
2.3.5绝对减值平滑
绝对折扣平滑的核心思想是对低频n-gram的概率估计进行折扣,并将这些折扣下来的概率重新分配给未见过的n-gram(即在训练数据中没有出现过的n-gram)。具体来说,对于每个频率为r的n-gram,我们从它的计数中减去一个固定的值d(折扣量),然后使用剩余的计数来计算概率。
下面我们给出一个简单的例子来帮助大家理解他的原理:
假设我们有一个简单的bigram模型,并且我们选择了折扣量 d=0.5。我们的训练语料库中包含了以下bigram及其计数:
I like (2次)
like cats (3次)
love dogs (1次)
- 词汇表 V 包含5个词:I, like, love, cats, dogs
第一步:绝对折扣平滑后的Bigram概率计算
现在我们要计算 "love cats" 这个bigram的概率,它在训练语料库中从未出现过。按照绝对折扣平滑的方法,我们会首先对已有的bigram应用折扣,比如:
- P'(like | I) = max(2 - 0.5, 0) / (2 + 3 + 1) = 1.5 / 6
- P'(cats | like) = max(3 - 0.5, 0) / (2 + 3 + 1) = 2.5 / 6
- P'(dogs | love) = max(1 - 0.5, 0) / (2 + 3 + 1) = 0.5 / 6
第二步:折扣下来的概率空间
对于每一个bigram,我们实际上从其原始计数中减去了 d,这些减去的值代表了可以重新分配给未观察到的n-gram的概率。我们可以简单地将所有被折扣的值加起来,作为总的可分配概率空间。
在这个例子中,我们折扣了三个bigram,总共折扣下来 0.5+0.5+0.5=1.5的概率空间
第三步:计算未见过的bigram的概率
现在,我们需要计算未见过的bigram的概率。未见过的bigram的总数是bigram的总数减去已知bigram的总数,即 N−3=6−3=3。我们将每个bigram的折扣量 d乘以已知bigram的数量,然后除以未见过的bigram的总数和bigram的总数 N。
未见过的bigram的概率是:
Psmoothed(unseen bigram)= 0.5×3 / 3×6 =1.5 / 18=0.0833
其中bigram的总数=2+3+1=6,
已知bigram的总数=3(I like ,like cats ,love dogs)
因此,绝对减值平滑后的bigram概率如下:
Psmoothed(I like)=0.25
Psmoothed(like cats)≈0.4167
Psmoothed(love dogs)≈0.0833
Psmoothed(unseen bigram)=0.0833
这些概率的总和应该等于1: 0.25+0.4167+0.0833+0.0833=0.8333+0.1667=1
绝对折扣平滑结合了回退机制,使得模型能够更好地处理稀疏数据问题,同时保持对高频n-gram的敏感度。这种方法在实践中表现良好,尤其是在大规模语料库上。
2.4应用
1.音字转换问题
2.分词问题
具体原理在这里:自然语言处理NLP中的N-gram模型_.gelnx nlp-优快云博客
2.5思考问题
N-gram的原理和建模方法?
平滑技术是解决什么问题的?简要描述每种平滑技术的作用。
有哪些文本表示模型?他们各有什么优缺点?来源:百面机器学习