n-gram的原理

NLP连载系列:

  1. NLP入门:文本特征的表示方式
  2. 命名实体分类NER初识
  3. n-gram的原理
  4. CS224N笔记(一):word2vec超详细解析
  5. CS224N笔记(二) Lecture1~2 :深入理解Glove原理
  6. CS224N笔记(三) Lecture 6~7:深入理解循环神经网络RNN模型
  7. CS224N笔记(四) Lecture 7:循环神经网络RNN的进阶——LSTM与GRU

1. 共现矩阵

共现矩阵描述的是在一个固定大小的滑动窗口下,两个词同时出现的频次。假设共现矩阵用XX表示,半窗口大小为mm,则Xi,jX_{i,j}表示在语料库中,以词wiw_i为中心词时,wiw_i前后2m2m个词内wjw_j出现的次数。举例说明如下图:

共现矩阵例子/Untitled.png

假设语料库中的词典表示为VV,则共现矩阵的大小为V×V|V| \times |V|,词典的大小一般很大,因此共现矩阵也非 常巨大,这也是n-gram的一大弊端。

共现矩阵中是对称的,每一行或每一列都可以作为词向量,但是n-gram其实很少用到词向量,更多的是基于统计值预测序列的某个序列上是什么词。真用到词向量的一个例子是Glove ,在那里共现矩阵的每一行会归一化得到一个概率值P(ij)P(i|j),表示在窗口2m2m内,词wjw_j出现时,词wiw_i出现的概率。

以上的描述都是基于窗口的,还有一种方法是基于全篇文章(Word Document Maxtirx),可以理解为窗口为一整篇文章的大小,矩阵Xi,jX_{i,j}表示在第jj篇文章中,词wiw_i出现的频次,矩阵X的大小为V×M|V| \times M,其中MM为文章的篇数。

2. 数学描述

n-gram作为一种基于统计语言,应该可以用数学的语言描述。我们的目标是建立下面的模型:

p(W)=p(w1T)=p(w1,w2,...,wT)=p(w1)p(w2w1)p(w3w12)p(wTw1T1)p(W)=p(w_1^T)=p(w_1,w_2,...,w_T)=p(w_1) \cdot p(w_2|w_1) \cdot p(w_3|w_1^2) \dots p(w_T|w_1^{T-1})

模型中的基本元素是p(wkw1k1)p(w_k|w_1^{k-1}),只需要找到这个概率的表示方法即可,根据贝叶斯公式:

p(wkw1k1)=p(w1k)p(w1k1)p(w_k|w_1^{k-1})=\frac{p(w_1^k)}{p(w_1^{k-1})}

再三注意,w1kw_1^k上的k不是幂次,w1kw_1^k表示是序列w1,w2,..wkw_1,w_2,..w_k,这也解释了上面贝叶斯公式的分子为什么不是p(w1k,w1k1)p(w_1^k, w_1^{k-1}),因为w1kw_1^k已经将w1k1w_1^{k-1}包含进去了,直接简写在一起就好了。

根据大数定理,上式可以表示为为:

p(wkw1k1)count(w1k)count(w1k1)p(w_k|w_1^{k-1})\approx\frac{count(w_1^k)}{count(w_1^{k-1})}

count(w1k)count(w_1^k)表示的是语料库中,序列w1kw_1^k出现的频次,这其实就是在计算一个共现矩阵,只不过这里没有限制窗口大小,如果k很大,那么分子和分母的统计将会消耗巨大的算力。n-gram的基本思想,是它做了一个n-1阶的Markov假设,即认为一个词出现的概率只与它前面的n-1个词相关,即

p(wkw1k1)p(wkwkn+1k1)=p(wkn+1k)p(wkn+1k1)count(wkn+1k)count(wkn+1k1)p(w_k|w_1^{k-1}) \approx p(w_k|w_{k-n+1}^{k-1}) = \frac{p(w_{k-n+1}^k)}{p(w_{k-n+1}^{k-1})} \approx \frac{count(w_{k-n+1}^k)}{count(w_{k-n+1}^{k-1})}

这样在计算共现矩阵时,就只需要在大小为n的窗口内进行,不用统计一个长序列w1kw_1^k的频次,大大缩减了计算量。

至此,n-gram统计语言模型的关键概率p(wkw1k1)p(w_k|w_1^{k-1})计算完毕,基于这个概率可以对给定的序列预测下一个词最可能是什么。

3. 计算优化

即使做了Markov假设,n-gram依旧很耗费算力和存储,因为共现矩阵的大小与词典的大小有关,词典通常非常大,因为共现矩阵会非常大,推理速度也会很慢。下图给了一个共现矩阵参数量的参考值,n表示的是窗口大小,词典大小为20万(汉语词汇量的大致量级)。

n与模型参数的关系

为了进一步优化计算,在获得共现矩阵后,通常会对它进行降维,常见的方法比如PCA和SVD,用SVD降维还被讲成了故事,从多义词的角度来讲述,参考文献3、4。

此外,由于语料库中某些序列的频次为0,那么在计算概率是有可能出现分子或分母为0的情况,这不能说明这些序列的真的不存在,只能说语料库不够大没有覆盖到,所以通常是会进行平滑处理,最简单的方式是给频次+1。

4. 参考文献

  1. word2vec中的数学
  2. Stanford cs224n Lecture 2 - Word Vectors and Word Senses (slides-marginnote)
  3. https://www.cnblogs.com/sancallejon/p/4963630.html
  4. https://blog.csdn.net/qq_16633405/article/details/80577851
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信