1. 共现矩阵
共现矩阵描述的是在一个固定大小的滑动窗口下,两个词同时出现的频次。假设共现矩阵用 X X X表示,半窗口大小为 m m m,则 X i , j X_{i,j} Xi,j表示在语料库中,以词 w i w_i wi为中心词时, w i w_i wi前后 2 m 2m 2m个词内 w j w_j wj出现的次数。举例说明如下图:
假设语料库中的词典表示为 V V V,则共现矩阵的大小为 ∣ V ∣ × ∣ V ∣ |V| \times |V| ∣V∣×∣V∣,词典的大小一般很大,因此共现矩阵也非 常巨大,这也是n-gram的一大弊端。
共现矩阵中是对称的,每一行或每一列都可以作为词向量,但是n-gram其实很少用到词向量,更多的是基于统计值预测序列的某个序列上是什么词。真用到词向量的一个例子是Glove ,在那里共现矩阵的每一行会归一化得到一个概率值 P ( i ∣ j ) P(i|j) P(i∣j),表示在窗口 2 m 2m 2m内,词 w j w_j wj出现时,词 w i w_i wi出现的概率。
以上的描述都是基于窗口的,还有一种方法是基于全篇文章(Word Document Maxtirx),可以理解为窗口为一整篇文章的大小,矩阵 X i , j X_{i,j} Xi,j表示在第 j j j篇文章中,词 w i w_i wi出现的频次,矩阵X的大小为 ∣ V ∣ × M |V| \times M ∣V∣×M,其中 M M M为文章的篇数。
2. 数学描述
n-gram作为一种基于统计语言,应该可以用数学的语言描述。我们的目标是建立下面的模型:
p ( W ) = p ( w 1 T ) = p ( w 1 , w 2 , . . . , w T ) = p ( w 1 ) ⋅ p ( w 2 ∣ w 1 ) ⋅ p ( w 3 ∣ w 1 2 ) … p ( w T ∣ w 1 T − 1 ) 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(W)=p(w1T)=p(w1,w2,...,wT)=p(w1)⋅p(w2∣w1)⋅p(w3∣w12)…p(wT∣w1T−1)
模型中的基本元素是 p ( w k ∣ w 1 k − 1 ) p(w_k|w_1^{k-1}) p(wk∣w1k−1),只需要找到这个概率的表示方法即可,根据贝叶斯公式:
p ( w k ∣ w 1 k − 1 ) = p ( w 1 k ) p ( w 1 k − 1 ) p(w_k|w_1^{k-1})=\frac{p(w_1^k)}{p(w_1^{k-1})} p(wk∣w1k−1)=p(w1k−1)p(w1k)
再三注意, w 1 k w_1^k w1k上的k不是幂次, w 1 k w_1^k w1k表示是序列 w 1 , w 2 , . . w k w_1,w_2,..w_k w1,w2,..wk,这也解释了上面贝叶斯公式的分子为什么不是 p ( w 1 k , w 1 k − 1 ) p(w_1^k, w_1^{k-1}) p(w1k,w1k−1),因为 w 1 k w_1^k w1k已经将 w 1 k − 1 w_1^{k-1} w1k−1包含进去了,直接简写在一起就好了。
根据大数定理,上式可以表示为为:
p ( w k ∣ w 1 k − 1 ) ≈ c o u n t ( w 1 k ) c o u n t ( w 1 k − 1 ) p(w_k|w_1^{k-1})\approx\frac{count(w_1^k)}{count(w_1^{k-1})} p(wk∣w1k−1)≈count(w1k−1)count(w1k)
c o u n t ( w 1 k ) count(w_1^k) count(w1k)表示的是语料库中,序列 w 1 k w_1^k w1k出现的频次,这其实就是在计算一个共现矩阵,只不过这里没有限制窗口大小,如果k很大,那么分子和分母的统计将会消耗巨大的算力。n-gram的基本思想,是它做了一个n-1阶的Markov假设,即认为一个词出现的概率只与它前面的n-1个词相关,即
p ( w k ∣ w 1 k − 1 ) ≈ p ( w k ∣ w k − n + 1 k − 1 ) = p ( w k − n + 1 k ) p ( w k − n + 1 k − 1 ) ≈ c o u n t ( w k − n + 1 k ) c o u n t ( w k − n + 1 k − 1 ) 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})} p(wk∣w1k−1)≈p(wk∣wk−n+1k−1)=p(wk−n+1k−1)p(wk−n+1k)≈count(wk−n+1k−1)count(wk−n+1k)
这样在计算共现矩阵时,就只需要在大小为n的窗口内进行,不用统计一个长序列 w 1 k w_1^k w1k的频次,大大缩减了计算量。
至此,n-gram统计语言模型的关键概率 p ( w k ∣ w 1 k − 1 ) p(w_k|w_1^{k-1}) p(wk∣w1k−1)计算完毕,基于这个概率可以对给定的序列预测下一个词最可能是什么。
3. 计算优化
即使做了Markov假设,n-gram依旧很耗费算力和存储,因为共现矩阵的大小与词典的大小有关,词典通常非常大,因为共现矩阵会非常大,推理速度也会很慢。下图给了一个共现矩阵参数量的参考值,n表示的是窗口大小,词典大小为20万(汉语词汇量的大致量级)。
为了进一步优化计算,在获得共现矩阵后,通常会对它进行降维,常见的方法比如PCA和SVD,用SVD降维还被讲成了故事,从多义词的角度来讲述,参考文献3、4。
此外,由于语料库中某些序列的频次为0,那么在计算概率是有可能出现分子或分母为0的情况,这不能说明这些序列的真的不存在,只能说语料库不够大没有覆盖到,所以通常是会进行平滑处理,最简单的方式是给频次+1。
4. 参考文献
- word2vec中的数学
- Stanford cs224n Lecture 2 - Word Vectors and Word Senses (slides-marginnote)
- https://www.cnblogs.com/sancallejon/p/4963630.html
- https://blog.csdn.net/qq_16633405/article/details/80577851