# 信息检索模型
信息检索的主题之一是定义一个无须工程师提炼规则的模型。这样的检索模型(retrieval model)应该尽可能准确地捕获相关性的概念,评估查询词和文档相关性的方法叫做检索模型。给定一组搜索结果,检索模型将对它们进行排序:结果越相关,分数越高。
## 布尔检索模型
布尔检索法是指利用布尔运算符连接各个检索词,然后由计算机进行逻辑运算,找出所需信息的一种检索方法。
布尔检索模型中主要有AND、OR、NOT三种逻辑运算,布尔逻辑运算符的作用是把检索词连接起来,构成一个逻辑检索式。
# 示例
建立单词-文档矩阵
查询包含“谷歌”“开源”但不包含“大会”的文档,构造布尔查询:
然后进行与运算:
结果向量中第2和第4个元素为1,文档2和文档4是符合查询条件的结果。
# 布尔检索模型的缺点
1️⃣ 检索策略只基于0和1二元判定标准。例如,一篇文档只有相关和不相关两种状态,缺乏文档分级(rank)的概念,不能进行关键词重要性排序,限制了检索功能。
2️⃣ 没有反映概念之间内在的语义联系。所有的语义关系被简单的匹配代替,常常很难将用户的信息需求转换为准确的布尔表达式。
3️⃣ 完全匹配会导致太少的结果文档被返回。没有加权的概念,容易出现漏检。
## TF-IDF
一种度量文档相对于查询的重要性的常见方法,是利用基于查询和文档中的词项计算出的统计数据。这种检索模型称为信息检索的统计模型(statistical models for information retrieval)
# 示例
问句:“bernhard riemann influence”
文档集:【doc1】“riemann bernhard - life and works of bernhard riemann”
【doc2】“thomas bernhard biography - bio and influence in literature”
【doc3】“riemann hypothesis - a deep dive into a mathematical mystery”
计算:score(doc1) = tf-idf(riemann) + tf-idf(bernhard) = 1.28 + 1.28 = 2.56
score(doc2) = tf-idf(bernhard) + tf-idf(influence) = 1 + 1 = 2
score(doc3) = tf-idf(riemann) = 1
📍 注:tf-idf(·)形式不唯一,此处算出的值假设以某公式计算得到
可以看到,基于 TF-IDF 进行的评分仅依赖于纯粹的词项频率,检索模型缺少对查询意图语义上的理解,而一个好的检索模型应该考虑语义。
## 向量空间模型 VSM
向量空间模型是一种基于线性代数的信息检索模型。向量空间模型(VSM)通过将查询和文档表示为向量,从而基于TF-IDF 权重方案度量它们的相似程度。每个文档可以由一维向量表示,其大小等于所有文档中词项的数量。向量中的每个位置表示一个词项,其值等于该词项在该文档中的 TF-IDF 值。
💬"向量空间检索模型最开始以TF(词频)作为维度的值,然后发展成以TF*IDF作为维度值。"
沿用上述的例子,得到文档集中每个文档的向量表示:
对于查询问句也可以这样做,因为它们也是由词项组成的。唯一的区别是词项频率可以是本地的 (查询词项出现在查询中的频率),也可以来自文档集(查询词项出现在文档数据中的频率)。
现在文档和查询都以向量形式表示,如果希望计算出哪个文档与输入查询最匹配,则可以通过计算每个文档和输入查询之间的余弦相似度(即文档与查询向量之间夹角大小的度量)来实现(还有欧氏距离、点积等计算方式
为了可视化,我们只考虑词项“bernhard”和“riemann” ,绘制二维空间
夹角的角度越小,两个向量就越相似。
此外,这种词袋表示的一个问题是,向量的大小会随着现有词项的数量(文档中包含的所有不同单词,本例中为10)的增加而线性增长。
尽管存在这些限制,VSM 和 TF-IDF 还是在许多生产系统中经常得到使用,并且可以取得良好的结果。
## BM25(Best Match 25)
Okapi BM25 是最知名、使用最广泛的概率模型之一。概率检索模型的分数是基于概率计算的。
在排序任务中,将估计某个文档(与给定查询)相关的概率表示为 ,其中 r 是相关性的二元度量。 r = 1:相关;r = 0:不相关
在概率检索模型中,人们通常按照 对给定查询的所有文档进行排序。
# 示例
假设我们增加了新文档【doc4】 “bernhard bernhard bernhard bernhard bernhard bernhard bernhard bernhard bernhard bernhard”。
在Lucene中使用 TF-IDF 和 VSM的结果为:
该文档doc4作为第二个结果被返回,这很奇怪。此外,doc4的分数几乎等于排序第一的文档doc1的分数。
在经典的 TF-IDF 方案中,高频率会导致高分数。
BM25试图放宽 TF-IDF 的两个限制:
1️⃣ 限制词项频率的影响,以避免对频繁重复的词项评分过高;
2️⃣ 更好地估计某个词项的文档频率的重要性。
尽管BM25源于概率相关性模型,与TF-IDF仍然有许多共同点。两种算法都用到了词频、逆文档频率和字段长度范化,但这些因子的定义稍有不同。
在Lucene中采用BM25的结果为:
这次doc4排序第三而不是第二。尽管这不是最佳结果,但是与最相关的文档相比,doc4的分数大大降低了。原因是 BM25 会“压缩”词项频率以使其低于某个可配置的阈值。这种情况下,BM25 减轻了“bernhard”的高词项频率的影响。
BM25 的另一个好处是,它会试图估计词项在文档中出现的概率。文档中多个词项的总文档频率等于单个词项出现在该文档中的概率的对数总和。
BM25的局限性在于:
1️⃣ 与 TF-IDF 一样,BM25 是一个词袋模型,所以它在排序时会忽略词项顺序;
2️⃣ 尽管一般情况下它表现良好,但是 BM25 基于启发式算法(一种可以得到相对好的结果的算法,但是不一定总是能正常工作),可能不适用于你的数据(你可能必须调整这些启发式算法);
3️⃣ BM25 会在概率估计上执行一些近似和简化,这在某些情况下会导致结果可接受度较低 (不能在长文档上很好地工作)。
📍 题外话:基于语言模型进行排序的其他概率方法通常在普通概率估计方面效果较好,但这并不总能带来更好的分数。
# BM25F
Okapi BM25模型提出之后被广泛应用,在计算相关性的时候只是把文档当作整体来考虑,但是并没有考虑文档不同域(也就是字段)的权重差异,结构化的数据会被切分成多个独立的域,以网页为例,网页有标题、摘要、主题词、内容等域,很显然网页标题是对一个网页内容的高度概括,标题中关键词的权重很显然要比网页内容中的关键字权重高。BM25F在BM25的基础上做了一些改进,把单词在文档域中的权重得分考虑进去。
📍 BM25和BM25F两种模型在TREC文本检索评测会议中都有很好的表现。BM25适用于没有结构的全文检索,而BM25F适用于结构化的文档检索
## 神经信息检索
经典的 VSM 也会将文档和查询视为向量,并使用余弦距离来度量它们的相似度。问题是,这种向量的大小会与索引单词的数量一起(线性地)急速增长。如果我们能提供更紧凑(固定大小)的单词表示呢?比如常用的Word2Vec(稠密向量在内存 (和空间,如果存储到磁盘) 方面负担不大,且在语义方面信息量更大
word2vec 为单词而不是单词序列提供向量。因此,首先要找到一种方法来使用词向量表示文档和查询。从词向量创建文档向量的一种简单方法是,将词向量的平均值作为单个文档向量的©。
简单的求算术平均会使得文档向量位于组成它的词向量的中心,此时求与查询最接近的文档结果会是doc4。
来自 doc4 的文本片段,这样的片段大多(或只)包含出现在查询中的单个词项。实现这种功能的一项常见技术是使用词项频率平滑平均文档向量。该技术没有将每个词向量除以文档长度,而是将每个词向量除以其词项频率©。
词项-频率平滑可以帮助分离生成的文档向量,使其不是位于词向量的中心,而是更接近频率较低(并且可能更重要)的单词。词项频率较低的文档排序较高,但是仍然足够接近查询向量。
如果不用普通词项频率,还可以用 TF-IDF 作为从词嵌入生成平均文档向量的平滑因子©。
# 资源整理
《深度学习搜索引擎开发:Java实现》
《从Lucene到Elasticsearch:全文检索实战》姚攀
《Elasticsearch搜索引擎开发实战》 罗刚