背景
在信息搜索中,我们做的第一步就是检索。对于文本检索中,第一步就是数据库中的内容与检索的内容进行匹配,符合匹配要求的话就根据相关业务处理。
在NLP中,我们可以认为是要让机器去理解检索内容,然后从现有数据库中返回对应内容。从这看文本匹配就是NLU(Nature Language Understand ,自然语言理解)中的核心内容了。
再延展一下,搜索这项功能在我们生活中也是太多太多。大众一点就是搜索引擎,商品搜索等,在问题系统中可以匹配相似的问题,然后返回对应答案等。
文本匹配包括监督学习方法以及非监督学习方法。或者分为传统方法和深度学习方法。传统的非监督学习方法有:Jaccard,Levenshtein(编辑距离),Simhash,BM25,VSM(向量空间)等,最具代表的算法当属BM25。其在著名的搜索解决方案Elastic中就有相关的使用。
BM25
BM25 在 20 世纪 70 年代到 80 年代被提出,到目前为止已经过去二三十年了,但是这个算法依然在很多信息检索的任务中表现优异,是很多工程师首选的算法之一。有时候全称是 Okapi BM25,这里的“BM”是“最佳匹配”(Best Match)的简称。
现代 BM25 算法是用来计算某一个目标文档(Document)相对于一个查询关键字(Query)的“相关性”(Relevance)的流程。通常情况下,BM25 是“非监督学习”排序算法中的一个典型代表。
下面部分内容参考文本相似度-bm25算法原理及实现。
假如我们有一系列的文档
D
\mathbf{D}
D,现在要搜索
Q
u
e
r
y
Query
Query。BM25的思想是,对
Q
u
e
r
y
Query
Query进行语素解析,生成语素
Q
\mathbf{Q}
Q;然后对于每个搜索文档
D
i
D_i
Di计算每个语素
Q
i
Q_i
Qi与文档
D
j
D_j
Dj的相关性,最后将所有的语素
Q
i
Q_i
Qi与
D
j
D_j
Dj进行加权求和,从而对搜索
Q
u
e
r
y
Query
Query与
D
j
D_j
Dj之间的相似性得分。将BM25算法总结成以下公式:
S
c
o
r
e
(
Q
u
e
r
y
,
D
i
)
=
∑
i
n
W
i
⋅
R
(
Q
i
,
D
j
)
Score(Query, D_i) = \sum_{i}^{n}W_i\cdot R(Q_i, D_j)
Score(Query,Di)=i∑nWi⋅R(Qi,Dj)
在中文中,我们通常将每一个词语当做
Q
i
Q_i
Qi,
W
i
W_i
Wi表示语素
Q
i
Q_i
Qi的权重,
R
(
Q
i
,
D
j
)
R(Q_i, D_j)
R(Qi,Dj)表示语素
Q
i
Q_i
Qi与文档
D
i
D_i
Di的相关性得分关系。
判断一个词语与一个文档的相关性权重,较常用的就是TF-IDF算法中的IDF,该算法使用的公式如下:
I
D
F
(
q
i
)
=
log
N
−
n
(
Q
i
)
+
0.5
n
(
Q
i
)
+
0.5
IDF(q_i) = \log \frac{N-n(Q_i) + 0.5}{n(Q_i) + 0.5}
IDF(qi)=logn(Qi)+0.5N−n(Qi)+0.5
其中:
- N 表示待检索文档的数目
- n ( Q i ) n(Q_i) n(Qi)表示包含 Q i Q_i Qi的文档数
IDF的物理意义就是:对应给定的文档集合,包含 Q i Q_i Qi的文档多了,那么 Q i Q_i Qi的权重就应该低一点。
对于语素
Q
i
Q_i
Qi与文档
D
j
D_j
Dj的相关性得分
R
(
Q
i
,
D
i
)
R(Q_i, D_i)
R(Qi,Di),其在BM25算法中的公式如下:
R
(
Q
i
,
D
j
)
=
f
i
⋅
(
k
1
+
1
)
f
i
+
K
⋅
q
f
i
(
k
2
+
1
)
q
f
i
+
k
2
R(Q_i, D_j) = \frac{f_i\cdot(k_1 + 1)}{f_i + K}\cdot \frac{qf_i(k_2+1)}{qf_i + k_2}
R(Qi,Dj)=fi+Kfi⋅(k1+1)⋅qfi+k2qfi(k2+1)
K
=
k
1
⋅
(
1
−
b
+
b
⋅
D
j
l
a
v
g
D
l
)
K=k_1\cdot(1 - b+ b\cdot\frac{D_j^l}{avg D^l})
K=k1⋅(1−b+b⋅avgDlDjl)
这里引入多个变量,其中:
- k 1 k_1 k1, k 2 k_2 k2, b b b为调节因子,根据经验通常为 k 1 = 2 , b = 0.75 k_1=2,b=0.75 k1=2,b=0.75
- f i f_i fi表示 Q i Q_i Qi在 D j D_j Dj中出现的频率(次数)
- q f i qf_i qfi表示 Q i Q_i Qi在 Q u e r y Query Query中出现的频率(次数)
- D j l D_j^l Djl表示文档 D j D_j Dj长度
- a v g D l avg D^l avgDl表示所有文档的平均长度
从公式可以看出 b b b的物理意义:调整文档长度对相关性的影响。 b b b越大,则 K K K就越小,相关性得分就越大,反之越小。文档长度越长, K K K也会变大,相关性得分就会越小,其在相关性得分作用可以这样理解:当文档较长时,那么包含 Q i Q_i Qi的概率就变大,那么长文档与 q i q_i qi的相关性应该比段文档与 Q i Q_i Qi的相关性要弱。
通常,
Q
i
Q_i
Qi在
Q
u
e
r
y
Query
Query中出现的一次,则也可将公式化简成以下形式:
R
(
Q
i
,
D
j
)
=
f
i
⋅
(
k
1
+
1
)
f
i
+
K
R(Q_i, D_j) = \frac{f_i\cdot(k_1 + 1)}{f_i + K}
R(Qi,Dj)=fi+Kfi⋅(k1+1)
综上来说,BM25算法的相关性得分公式可有如下形式:
S
c
o
r
e
(
Q
u
e
r
y
,
D
i
)
=
∑
i
n
I
D
F
(
Q
i
)
⋅
f
i
⋅
(
k
1
+
1
)
f
i
+
k
1
⋅
(
1
−
b
+
b
⋅
D
j
l
a
v
g
D
l
)
Score(Query, D_i) = \sum_{i}^{n}IDF(Q_i) \cdot \frac{f_i \cdot (k_1+1)}{f_i + k_1 \cdot (1- b + b\cdot \frac{D_j^l}{avg D^l})}
Score(Query,Di)=i∑nIDF(Qi)⋅fi+k1⋅(1−b+b⋅avgDlDjl)fi⋅(k1+1)
那么,当通过使用不同的语素分析方法,语素权重判定方法以及语素与文档的相关性判定方法,可以衍生很多不同的搜索相关性计算方法,灵活性也比较大。