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