【转】相关性打分

原文:https://www.baidu.com/link?url=9KX_z-nR7nhYo9rb18V8Jl3RJbLB3TPuvS3nwgzxaB7-4uLT4-Seln0i-juK7UuBdj_LucSnLxTL0R0dA3csAq&wd=&eqid=c38628d80000913b000000055f5c827a
BM25算法是一种常见用来做相关度打分的公式,思路比较简单,主要就是计算一个query里面所有term和文档的相关度,然后在把分数做累加操作,而每个词的相关度分数主要还是受到tf/idf的影响。公式如下:
score(Q, d) = sum_{t in Q} W_t R(t, d)
其中:R(t,d)是每个词和文档的相关度值;t代表query中的term;d代表相关的文档;W_t是词t的权重。

W_t可由外部设置,默认是idf值,idf公式的基本思想是:词的重要程度和其出现在总文档集合里的频率成反比。其公式如下:
IDF(t) = log frac{N-n(t) + 0.5}{n(t) + 0.5}
其中:N是文档总数;n(t)是包含该词的文档数;0.5是调教系数,避免n(t)为0的情况。取个log是为了让idf的值受N和n(t)的影响更加平滑。

从这个公式可以看出当N越大,n(ti)越小时idf值越大,

下面是R(t,d)的公式,
begin {align} & R(t, d) = \frac{tf(t)(k_1 + 1)}{tf(t) + K(d)} \frac{qf(t)(k_2 + 1)}{qf(t) + k_2} \ \ & K(d) = k_1(1-b + b \frac{dl}{avgdl}) end {align}
其中: k_1k_2b都是调节因子,一般k1=2k2=1b=0.75tf(t)是词t在文档中的次数,qf(t)代表词在查询句里的次数;dl是文档长度,avgdl是文档平均长度;

可以看出如果其他因素一样dl越大,相关度越低;至于除以一个avgdl,我想是拿本篇文档长度和整体文档长度水平做比较 ,以免单独取dl值时过大。

乘积的左边因数代表词在文档中的次数关系,乘积的右边因数代表词在查询语句中的次数关系。绝大多数情况下,查询词在查询语句里面出现一次,所以qf(t)可以看成是1,又因为k_2为1,所以右边因数其实就等于1,所以公式可化简为下面这样:
R(q_i, d) = \frac{tf(t)(k_1 + 1)}{tf(t) + K}
公式化简后可得:
score(Q, d) = sum_{t in Q} IDF(t) \frac{tf(t)(k_1 + 1)}{tf(t) + k_1(1-b + b \frac{dl}{avgdl})} \
影响BM25公式的因数有

1 idfidf越高分数越高

2 tftf越高分数越高

3 dl/avgdl : 如果该文档长度在文档水平中越高则分数越低。

4 k_1, k_2, b为分数的调节因子

BM25F(2004)

一般情况下,一篇文章是分为多个部分的,如 title,content,description,anchor 等,在BM25F算分公式中,这些部分被称为域(field)。有两篇文章,一篇文章的title部分与query 的BM25相关性得分为 a, 另一篇文章的content部分与query 的BM25相关性得分也为 a。假设不考虑这两篇文章其他部分与query的相关性情况,根据经验,一般第一篇文章应该应该比第一篇文章更相关。BM25F 引入了文章d的每个域的信息,它将每个term在文章d中的每个域中的相关性进行了处理。公式如下:
begin {align} & score(Q, d) = \sum_{t in Q} IDF(t) \frac{w(t,d)}{k_1 + w(t,d)} \ \ & w(t,d) = \sum_{f in d} \frac{tf(t,f,d) times boost_f}{1-b_f + b_f \frac{len(f, d)}{avglen(f)}} end {align}

OkaTP(2003)

BM25 被也称为 Okapi BM25, OkaTP是BM25与 term proximity 融合的相关性计算公式。

query中第 i 个term的权重定义为:

qw_i = \frac{qtf_i}{k_3+qtf_i} \cdot \log \frac{N-DF_i}{DF_i}

  • N is the sum of documents within all collections,
  • DF_i is the number of documents containing the term t_i within all collections.
  • qtf_iquery term frequency.

可以发现 qw_i 的定义在形式上比较像BM25中 query部分与IDF 的乘积。 区别是常量参数的设置。在论文中设置 k_3 = 1000.

term proximity 定义如下

\mathrm {tpi(t_i, t_j)} = \frac {1.0}{dist[t_i, t_j] ^2}
d(t_i, t_j) is the distance expressed in number of words between search term t_i and t_j.

下式体现了BM25与 term proximity 的融合, 该算法将BM25中的tf 替换成了 \sum_{occ(t_i, t_j)}tpi(t_i, t_j)
w_d(t_i, t_j) = (k_1 +1) \frac{\sum_{occ(t_i, t_j)}tpi(t_i, t_j)}{K+ \sum_{occ(t_i, t_j)}tpi(t_i, t_j)}

K 的定义和BM25相同。

OkaTP 最终定义为
OkaTP(q,d) = BM25(q,d) + \sum_{(t_i, t_j) in S}\min(qw_i, qw_j) \cdot w_d(t_i, t_j)
其中 S是 query中所有term 两两组合的集合。

BM25TP(2006)

该算法与 OkaTP 非常相似。

其中TP即 term proximity,在该算法中引入了proximity 信息来优化相关性计算效果。

假设一个query q中包含n个term {t_1, dots, t_n }d 表示一篇文章,任意两个不同term t_j, t_k 在文章 d 中所处位置的距离表示为 dist(t_j, t_k)。这两个term的
begin {align} & BM25TP(q, d) = BM25(q,d) + \sum_i^n \min{1, W_{t_i}} \cdot \frac{acc_d (t_i) \cdot (k_1 + 1)}{acc_d (t_i) + K} \ \ & acc_d (t_i) = \sum_{i \neq j} W_{t_i} \cdot \mathrm{tpi}_d(t_i, t_j) \ \ & \mathrm {tpi}_d = \sum_{ o(t_i) in \mathrm {occurrences of t_i in document d}} \frac {1}{dist[o(t_i), t_j] ^2} end {align}
note: query中的第 i 个term可能在 document 可能出现多次, 每一次出现用 o(t_i) 表示。

原始论文见 Term proximity scoring for ad-hoc retrieval on very large text collections
可以结合文章 Selective Term Proximity Scoring Via BP-ANN 理解上面第2,3两个公式。

newTP(2008)

文章认为OkaTP存在两个方面的问题 1. OkaTP 算分公式的后面部分(可以看做对于prase的算分)和前面的BM25部分是有重叠的,即一个term会同时出现在前后两个部分; 2.Linear combination of scores of unigrams and those of loose phrases may break the non-linear property of term frequency。

基于这两点提出了 newTP算法。 newTP中引入了 span的概念。 span 是根据query term在一个docment中的命中位置,将整个命中列表分割为多个片段,每个片段称为一个 expanded span。 span 的确定规则如下。

(1) The distance between the current and the next is bigger than a threshold MAX_DIS, then the chain is separated between these two hits;
(2) The current and the next hit are identical, then the chain is separated between these two hits;
(3) The next hit is identical to a hit with former continuous sub-chain, then the distance between the current and the next and the distance between the identical hit and its next is compared, the chain is separated at the bigger gap.
(4) Otherwise, go on scanning the next hit.

其中 MAX_DIS 是认为设定的。

根据span的中 query term的密度和数量来确定一个term对于相关性的贡献。从而取代OkaTP 中的 tpi 和 tf部分。

一个span_i 中的term t的 对于相关性的贡献表示为:
f(t, espan_i) = [\frac {n_i}{width(espan_i)}]^x \cdot (n_i)^y
其中:

  • t is a query term,
  • espan_i is an expanded span that contains t,
  • n_i is the number of query terms that occur in espan_i
  • Width(espan_i) is the width of espan_i
  • x is an exponent that is used to restrain that the value decayed too rapidly with the density of an expanded span increasing,
  • y is an exponent that is used to prompting the case that more unique query terms appear in one expanded span.

一个term t 在整个document 中对相关性的贡献为:
rc_t = \sum_i f(t, espan_i)
可以看出 rc 中包含了 proximity的信息 和 tf的信息。

直接用 rc 替换 BM25 中的 tf, 得到新的相关性计算公式:
newTP = \sum_{t in Q} w_t \cdot \frac{rc_t(k_1 + 1)}{rc_t + K}

BM25TOP(2012)

其中TOP即 term order proximity. 该算法是在BM25TP的基础上进行的优化。在该算法中引入了 term oder信息, 如果两个term在 query中出现的顺序 与 其在document中的顺序相反则进行惩罚, 如果顺序相同则 reward。

在BM25TP算法中 使用的 dist[o(t_i), t_j] ^2 来计算proximity, 但是这个公式对于term oder是不敏感的。就会认为 John is faster than Mary 和 Mary is faster than John 两个句子是相同的。

为了说明 BM25TOP算法,先引入如下两个定义。

p_{t_i;Q}: The position of t_i in query Q
p_{t_i;d}: The position of t_i in document d

在BM25TOP 中使用了一个新的公式对 dist[o(t_i), t_j] ^2 进行了替换。这个公式应该符合如下三个条件。

  • always positive, regardless of p_{t_x ;d} - p_{t_y ;d} > 0 or p_{t_x ;d} - p_{t_y ;d} < 0;
  • rewards term proximity; becoming higher as p_{t_x ;d} - p_{t_y ;d} increases and vice versa; (since the score is inversely proportional to this quantity).
  • rewards correct term ordering, becoming higher in case of p_{t_x ;d} - p_{t_y ;d} < 0 and vice versa;

满足前两条是BM25TP算法中dist 函数也能满足的,第三条是增加考虑 term order 的一项。

满足以上三个条件的公式挺多,论文中选择了如下公式。
begin {align} & phi_d(t_x, t_y) = [a_d(t_x, t_y)]^2 - a_d(t_x, t_y) +1 \ \ & a_d(t_x, t_y) = \frac{(p_{t_x ;d} - p_{t_y ;d}) }{xi(t_x, t_y)} \ end {align}
其中
xi(t_x, t_y) = left{ begin {align} 1, & p_{t_x ;Q} - p_{t_y ;Q} > 0 \ -1, & p_{t_x ;Q} - p_{t_y ;Q} < 0 \ end {align} right .
phi_d(t_x, t_y) 的大小表示 t_xt_y 在文档 d 中 的相对距离,符号说明了这两个term在query和document中的顺序是否相同,正号(+) 表示顺序相同,符号(-) 表示这两个term在query和document中的顺序相反。

phi_d(t_x, t_y)a_d(t_x, t_y) 的函数变化图像如下:

[图片上传中...(image-8d6891-1599898211594-0)]

note: proximity 是 phi_d(t_x, t_y) 的倒数, phi_d(t_x, t_y) 值越大 proximity 越小。

从上图可以看出,两个term距离越远, phi_d(t_x, t_y) 越大, proximity 越小;

当对于两对term的 a_d 的大小相等,但符号相反时,符号为负(-) 的一对 term 的proximity会更小。

下面将BM25TOP的计算公正整理如下:
begin {align} & BM25TOP(q, d) = BM25(q,d) + \sum_i^n min{1, W_{t_i}} \cdot \frac{acc_d^” (t_i) \cdot (k_1 + 1)}{acc_d^” (t_i) + K} \ \ & acc_d^” (t_i) = \sum_{i \neq j} W_{t_i} \cdot \mathrm{tpi}_d^”(t_i, t_j) \ \ & \mathrm {tpi}_d’’ = \sum_{ o(t_i) in \mathrm {occurrences of t_i in document d}} \frac {1}{phi_d(o(t_i), t_j)} \ \ & phi_d(o(t_i), t_j) = [a_d(o(t_i), t_j)]^2 - a_d(o(t_i), t_j) +1 \ \ & a_d(t_i, t_j) = \frac{(p_{o(t_i) ;d} - p_{t_j ;d}) }{xi(o(t_i), t_j)} \ end {align}
其中:
xi(o(t_i), t_j) = left{ begin {align} 1, & p_{o(t_i) ;d} - p_{t_j ;d} > 0 \ -1, & p_{o(t_i) ;d} - p_{t_j ;d} < 0 \ end {align} right .

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,836评论 6 540
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,275评论 3 428
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,904评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,633评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,368评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,736评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,740评论 3 446
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,919评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,481评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,235评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,427评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,968评论 5 363
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,656评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,055评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,348评论 1 294
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,160评论 3 398
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,380评论 2 379