IR学习笔记 #02 统计语言模型
本文最后更新于:2022年11月28日 下午
基于对布尔模型的改进,提出一种新的最佳匹配模型。
统计语言模型 | Statistical Language Models
首先探讨的是 Doc (文档) 的呈现形式,引入 Topic (主题) 来表述一个文档的隐含语义,起到索引作用。基于以下两个假设:
- Words common in document are common in topic.
- Words not in document much less likely.
可以得出,Topic 是由 Doc 中的一些关键词勾勒出来的。于是引入 \(P(w|Doc)\) 概率分布表:统计每个词在文档中出现频度(频率)——基于大数定律。
但 Topic 的难确定性(语义理解不同、可能有多个主题)导致其难以直接计算,因此可以用近似估算。
\[ P\left( w|Topic_D \right) \approx P\left( w|D \right) =tf\left( w,D \right) /len\left( D \right) \]
事实上,我们可以认为 Topic 是一种「语言模型」,\(P\left( w|Topic_D \right)\) 可以认为是在 Topic 下生成该 word 的概率,即该 word 在这个「语言模型」中被生成的概率,故 word 可以不在 Topic 中出现,但也有概率生成。
语言模型化 | Language Modeling
定义 M 为我们试图描述的 language (语言),s 为该语言下观测到的文本串(由许多词条构成)。
M can be thought of as a “source” or a generator - a mechanism that can spit out strings that are legal in the language.
\(P(s|M)\) is the probability of getting “s” during random sampling from M.
语言的规模可大可小,把每种语言的规模缩小为一个 Topic(对应着语料库中的一个文档);这个 Topic 就决定了任意一个字符串在这个 Topic 所对应的「语言模型」中出现的概率:比如,在一个描述信息检索发展历史的文档中,“Washington” 出现的概率就会远远小于 “Robertson”。
那么,一旦我们确定了这个 Doc 所对应的「语言模型」\(M_D\) ,而 Q 是用户的 Query,我们是不是可以求出这个「语言模型」下生成 Q 的概率?概率最大者就是与查询最相关的文档。那么,我们就可以根据 $P(Q|M_D) $ 给所有的 Doc 排序,得到我们的查询结果。
多元语言模型 | N-gram Language Models
对于一个较长的 Query,我们采用分词的方法来计算它的生成概率。为此,首先通过几个例子明确语言模型中 N-gram 的概念:
- Unigram 一元分词,把句子分成一个一个的汉字,如:哈/工/大/深/圳
- Bigram 二元分词,每两个字组成一个词语,如:哈工/工大/大深/深圳
- Trigram 三元分词,每三个字组成一个词语,如:哈工大/工大深/大深圳
在以上例子中,我们可以知道一个文本串在一元语言中生成的概率将这样计算: \[ P\left( w_1w_2w_3 \right) =P\left( w_1 \right) \cdot P\left( w_2 \right) \cdot P\left( w_3 \right) \] 在二元语言中将这样计算: \[ P\left( w_1w_2w_3 \right) =P\left( w_1 \right) \cdot P\left( w_2|w_1 \right) \cdot P\left( w_3|w_2 \right) \] 可以发现,在 Unigram 中我们假设了单词之间的独立性,这就意味着它的本质是词的多项分布,而一个文本串可以看作是这个分布的一个实例。
对于更多元的分词 N-gram,我们是假设每个单词出现的概率只与它之前的 n-1 个单词相关,因此采用了条件概率。事实上,这是一种基于马尔可夫假设的模型,此时的文本串应是有序相关的,这就不属于 BoW 的范畴。
一般情况下,N 的取值都很小,实际自然语言处理应用中最多的是将 N = 3 的三元分词模型。原因如下:
- N 元模型的空间复杂度,是 N 的指数函数,即 $O( | V |^N ) \(,*V* 是一种语言的词汇量,一般在几万到几十万个。时间复杂度也是一个指数函数\)O( | V |^{N-1} ) $。
- 即使使用 N = 4 、N = 5 也不可能覆盖所有词与词之间的相关性。某两个词可能是一段话和一段话之间才会出现的。
多元语言模型的参数估计
针对一元模型,只需要统计该「语言模型」生成的文档中,出现该 term 的频率,用频率近似概率即可——大数定律。
这里对二元模型展开探讨:估计 \(P\left( w_i|w_{i-1} \right)\),利用条件概率: \[ P\left(w_{i} \mid w_{i-1}\right)=\frac{P\left(w_{i-1}, w_{i}\right)}{P\left(w_{i-1}\right)} \] 于是,我们只需要统计 \(\left(w_{i-1}, w_{i}\right)\) 的有序词对在文档中的出现次数,再统计 \(w_{i-1}\) 的出现次数,即可估计其概率。
然而,存在这样一个问题:在文本中,两个词没有连续出现过,即频度为 0,那么它的概率就是 0 吗?如果词对 \(\left(w_{i-1}, w_{i}\right)\) 和 \(w_{i-1}\) 的出现次数相同,其概率就是 1 吗?这就涉及到了统计的可靠性问题,也称「不平滑问题」。
解决这些问题的主要方法是古德-图灵估计(Good-Turing Estimate)和卡茨退避法(Katz backoff)。
对出现次数大于某个阈值的词,频率不下调,即用频率代替概率;
对出现次数小于这个阈值的词,频率才下调,利用古德-图灵估计的相对频度来调整;
对出现次数等于 0 的词,利用卡茨退避法给予一个比较小的概率值。
这部分的内容属于语料库的自然语言处理,本文中不赘述,仅在后文针对零频问题介绍几种方法。
查询排序问题 | Ranking
当给定查询 Q 时,怎么根据统计语言模型进行排序呢?有三种排序方法,分别是:
- 查询似然排序 | Query-likelihood
为每个 Doc 确定其所对应的 \(M_D\),而用户的 Query 记为 \(q=(q_1,q_2,\cdots,q_k)\) 。则该查询在每个文档的「语言模型」下生成的概率可如下计算: \[ P\left(q_{1} \ldots q_{k} \mid M_{D}\right)=\prod_{i=1}^{k} P\left(q_{i} \mid M_{D}\right) \] 将所有计算结果排序,即可得到检索结果。要注意,这种方法对每个 Doc 计算出的概率都独立于其他 Doc,相关文档没有被利用到。
- 文档似然排序 | Document-likelihood
查询似然的翻转版本,为每个 Query 确定其所对应的 \(M_Q\),计算任意一个文档在该查询的「语言模型」下生成的概率: \[ P\left(D \mid M_{Q}\right)=\prod_{w \in D} P\left(w \mid M_{Q}\right) \] 但是,这种方法存在如下问题:
- 文档的长度相差很大,很难比较。
- 由于文档中出现的词很多没有出现在查询中,将会出现零频问题。
- 将会出现无意义的作弊网页,如将 Query 中的关键词无限重复。
要解决这些问题,需要引入 Likelihood Ratio (似然比),对文档长度加以归一。
\[ P\left(M_{Q} \mid D\right)=\frac{P\left(M_{Q}\right) P\left(D \mid M_{Q}\right)}{P(D)} \approx \frac{c \prod_{w \in D} P\left(w \mid M_{Q}\right)}{\prod_{w \in D} P(w \mid G E)} \] 其中,对每个文档计算其可能 「生成 \(M_Q\)」的概率,在用贝叶斯公式展开,其中的 \(P\left(M_{Q}\right)\) 对于每个文档可视作常数,再由分母的约束,对文档加以限制。
- Ranking by Model Comparison
结合前两种方法,提出了交叉熵(cross-entropy)的概念: \[ H\left(M_{Q} \| M_{D}\right)=-\sum_{w} P\left(w \mid M_{Q}\right) \log P\left(w \mid M_{D}\right) \] 这种方法同时考虑了查询 \(M_Q\) 和文档 \(M_D\),直接比较两种模型的相似度。要注意,\(M_Q\) 和 \(M_D\) 在公式中的顺序不能调换。
零频问题 | Zero frequency problem
有了上述排序模型,现在我们只需要从查询和文档中估算出 \(M_Q\) 和 \(M_D\)。
在本文的「语言模型」中,我们只需采用一元分词模型,独立性和独立分布可以简化许多问题。然而,在极大似然估计下,还是有个问题急需解决——零频问题,即有的 term 根本不出现在观测集中,我们该如何估算其概率?
这里介绍三种 Discounting Methods (折扣法) 来 Smoothing (平滑) :
Laplace correction:把每个词的词频都加 1,分母的总频数加上词项数 N。但是这种方法不适合较大的词典表。
Lindstone correction:把每个词都加一个很小的值 ε,分母的总频数加上 Nε。
Absolute Discounting:把词频不等于 0 的词减去一个很小的值 ε,再把减去的总值平均分配到词频为 0 的词上去,不改变分母。
除了折扣法,还有诸如插值法、退避法等方法也可以用于平滑。