一、向量空间模型
1.1 布尔模型与统计学模型
最早期的消息回溯模型是布尔模型(Boolean Model),这种模型将关键词用“与或非”连接成问答语句,譬如“DBMS AND Oracle AND NOT Sybase”,然后由系统返回Yes/No的回答。这种模型的构建和使用都相当简单,但它的缺点也很明显:
- 布尔语句一旦变长,就会有很多层括号,读起来也很不方便。
- 布尔模型很难控制回溯的文档数目。
- 布尔模型是命中模型,且没有对文档中的关键词设置权重,无法对文档进行排名。
- 布尔模型是完全匹配,不支持部分匹配,也很难进行复杂查询,如如“全球首富是谁?高考最难的省份?”等等。
不同于布尔模型,后来的科学家提出了统计学模型(Statistical Model)。统计学模型分析的对象是关键词,文档可以表示成一个由词组构成的向量,值的大小为词的权重,即词的重要程度。消息回溯基于查询语句和文档的向量相似度大小,决定回溯的文档以及排序。由于该模型将文档和查询转换为向量并用向量计算来处理文本内容,所以又被称作向量空间模型(Vector Space Model)
1.2 TF-IDF值
如何衡量一个词的重要性?我们可以将此问题分成两个部分看:
- 这个词在某篇文档中的重要性如何?
- 这个词在所有文档中的重要性如何?
TF
对于第一个问题,我们可以用词频Term Frequency来衡量一个单词在文档中的重要程度,如一篇关于经济学的文章,“Economic, money, trade, market”等词的词频肯定高。文档 i i i 中关键词 j j j 的 t f tf tf 值的计算公式为 t f i , j = f i , j ∣ D i ∣ tf_{i,j}=\dfrac{f_{i,j}}{|D_i|} tfi,j=∣Di∣fi,j
其中 ∣ D i ∣ |D_i| ∣Di∣表示 i i i 文档的词数, f i , j f_{i,j} fi,j 表示 j j j 在文档 i i i 中出现的次数。
IDF
对于第二个问题,一般不重要的词,例如“I”、“the”、“and”这种,在所有文章里面都会出现的词,它们的重要性一定很低。相反地,在很少文章中出现的词,对于搜索引擎来说价值更高。我们可以使用反向文档频率Inverse Document Frequency作为该特性的评价指标。文档频率Document Frequency是包含某单词的文档个数,
i
d
f
idf
idf 则是
d
f
df
df 的呈负相关的变式。对于单词
j
j
j来说,它的
i
d
f
idf
idf 值计算公式为
d
f
j
=
∣
i
:
t
j
∈
D
i
∣
df_j=|i:t_j\in D_i|
dfj=∣i:tj∈Di∣
i
d
f
j
=
log
2
(
∣
D
∣
d
f
j
)
idf_j=\log_2(\dfrac{|D|}{df_j})
idfj=log2(dfj∣D∣)
其中,
∣
D
∣
|D|
∣D∣为所有文档的总数。
TF-IDF
TF和IDF的积,可以作为某个词在某篇文档中的重要性衡量,既然如此,我们就可以用TF和IDF表征整个文本空间的所有单词重要性,因而可以用
t
f
i
d
f
tfidf
tfidf矩阵的方式表示整个文本空间:
t
f
i
d
f
i
,
j
=
t
f
i
,
j
×
i
d
f
j
tfidf_{i,j}=tf_{i,j} \times idf_j
tfidfi,j=tfi,j×idfj
如果一个词在所有文档中出现(如 “the”),它的
i
d
f
idf
idf 值为0,在
t
f
i
d
f
tfidf
tfidf 矩阵中值也将为0;如果一个词
j
j
j 在文档
i
i
i 中未出现,相应地,它的
t
f
tf
tf 值为0,
t
f
i
d
f
tfidf
tfidf 矩阵中对应的值也将为0。
1.3 相似度计算
1.3.1 内积
在文档和查询中同时出现的词将获得更高的得分,因此文档 D i D_i Di 和 查询 Q Q Q 的相似程度能够以内积方式表示 s i m ( D i , Q ) = ∑ k = 1 t d i k q k sim(D_i,Q)=\sum_{k=1}^t d_{ik}q_k sim(Di,Q)=k=1∑tdikqk
1.3.2 余弦相似(主流)
尽管内积某种程度上表示了文档相似程度大小,但是它对短查询/短文章并不公平,长文章有更多的单词,可能会产生更多的匹配,但相关程度却不一定有短文章高。因此我们不应只从内积角度,而应该从方向的角度去分析Query和Document的相似。余弦相似的公式如下:
C
o
s
S
i
m
(
D
i
,
Q
)
=
D
∘
Q
∣
D
∣
∣
Q
∣
=
∑
k
=
1
t
d
i
k
q
k
∑
k
=
1
t
d
i
k
2
∑
k
=
1
t
q
k
t
2
CosSim(D_i,Q)=\dfrac{D\circ Q}{|D||Q|}=\dfrac{\sum_{k=1}^t d_{ik}q_k}{\sqrt{\sum_{k=1}^t}d_{ik}^2\sqrt{\sum_{k=1}^tq_{k_t}^2}}
CosSim(Di,Q)=∣D∣∣Q∣D∘Q=∑k=1tdik2∑k=1tqkt2∑k=1tdikqk
这里举个例子,假设有两个文档
D
1
D_1
D1
D
2
D_2
D2 和查询
Q
Q
Q, 关键词为
T
1
T_1
T1
T
2
T_2
T2
T
3
T_3
T3, 满足
D
1
=
2
T
1
+
3
T
2
+
5
T
3
D
2
=
3
T
1
+
7
T
2
+
T
3
Q
=
0
T
1
+
0
T
2
+
2
T
3
\begin{aligned}D_1 &= 2T_1+3T_2+5T_3\\D_2&=3T_1+7T_2+T_3\\Q&=0T_1+0T_2+2T_3\end{aligned}
D1D2Q=2T1+3T2+5T3=3T1+7T2+T3=0T1+0T2+2T3
那么有
C
o
s
S
i
m
(
D
1
,
Q
)
=
5
∗
2
/
38
4
=
0.81
CosSim(D_1,Q)=5*2/{\sqrt{38}\sqrt{4}}=0.81
CosSim(D1,Q)=5∗2/384=0.81
C
o
s
S
i
m
(
D
1
,
Q
)
=
1
∗
2
/
59
4
=
0.13
CosSim(D_1,Q)=1*2/{\sqrt{59}\sqrt{4}}=0.13
CosSim(D1,Q)=1∗2/594=0.13
1.3.3 其他指标
- Jaccard 系数 ∑ k = 1 t d i k q k ∑ k = 1 t d i k 2 + ∑ k = 1 t q k 2 − ∑ k = 1 t d i k q k \dfrac{\sum_{k=1}^{t}d_{ik}q_k}{\sum_{k=1}^td_{ik}^2+\sum_{k=1}^tq_k^2-\sum_{k=1}^{t}d_{ik}q_k} ∑k=1tdik2+∑k=1tqk2−∑k=1tdikqk∑k=1tdikqk
- Dice 系数 ∑ k = 1 t d i k q k ∑ k = 1 t d i k 2 + ∑ k = 1 t q k 2 − ∑ k = 1 t d i k q k \dfrac{\sum_{k=1}^{t}d_{ik}q_k}{\sum_{k=1}^td_{ik}^2+\sum_{k=1}^tq_k^2-\sum_{k=1}^{t}d_{ik}q_k} ∑k=1tdik2+∑k=1tqk2−∑k=1tdikqk∑k=1tdikqk
二、倒排索引
2.1 基本概念
倒排索引在搜索引擎中有着举重若轻的地位。大名鼎鼎的elasticsearch,及其底层框架luncene就是基于倒排索引实现。与正向索引相对,倒排索引以关键词为索引,映射到某个单词在一个文档或者一组文档中存储的位置。可以根据单词快速获取包含整个单词的文档列表。如下图例子,computer一词在Document 1中的第23、97和104个位置以及Document 3 的第43个位置出现,graph一词在Document 2的第5个位置以及Docuemtn 3的第44个位置出现。
为了提高效率document index一般用排序树(如b树)的形式存储,访存时间复杂度可以从线性优化为对数级别。且存储的数据可以为前缀树,进一步节省非叶节点存储消耗。
2.2 how to work?
构建
- 构建文档时,先对文档进行编号,形成文档列表。
- 对每一个文档的数据进行分词,构建字典,并对字典进行编号,以关键词创建索引。然后记录包含该单词的所有文档编号以及位置信息。
使用
- 对查询分词
- 使用分词结果去倒排索引列表中进行匹配,返回包含词条的所有文档编号(及位置信息)。
- 根据文档编号和位置信息到文档列表中锁定原文信息。
2.3 好处
- 对布尔模型的消息回溯系统,倒排索引能快速锁定包含关键词的文档集合,效率非常高。锁定文档集合后直接进行与或非计算即可。
- 对概率模型来说,倒排索引方便了tf-idf值的计算,并且支持词组查询。
2.4 缺点
- 花费了存储开销在posting list上(或超过100%)
- 高昂的增、删、改费用。尽管对word index的查询很快,但是在posting list中修改的时间复杂度是线性级别,文档数目多的时候这个消耗是非常大的。
- 布尔模型中的花销随查询条件增加陡增
因为快考试就不水太多字了,如果读者有问题的可以在评论区提问,我有空会一一解答。