Elasticsearch:向量空间(Vector Space Model)

向量空间(Vector Space Model)提供比较多术语查询的一种方式,单个分数代表文档与查询的匹配程度,为了做到这点,这个模型将文档和查询都以向量的形式表示:

一个向量实际上就是包含很多数字的一个一维数组,例如:
[1,2,5,22,3,8]
在向量空间模型里,向量里的每个数字都代表一个术语的权重,和TF/IDF计算方式类似。

尽管 TF/IDF 是向量空间模型计算术语权重的默认方式,但不是唯一的方式,ElasticSearch还有其他模型(如:Okapi-BM25)。TF/IDF是默认的因为它是个经检验过的简单、高效算法,可以提供高质量的搜索结果。

如果我们有查询“happy hippopotamus”,常见词 happy 的权重较低,不常见词 hippopotamus 权重较高,假设 happy的权重是2,hippopotamus 的权重是5,我们可以将这个二维向量——[2,5]——在坐标系下作条直线,线起于(0,0)点终于(2,5)点:

613455-20160308175355585-430511576.png

 
现在,假想我们有三个文档:
 
  1. I am happy in summer.
  2. After Christmas I'm a hippopotamus.
  3. The happy hippopotamus helped Harry.


我们可以为每个文档都创建一个包括每个查询术语(happy 和 hippopotamus)权重的向量,然后将这些向量置入同一个坐标系中: 
  • 文档 1:(happy,____________)——[2,0]
  • 文档 2:(_____,hippopotamus)——[0,5]
  • 文档 3:(happy,hippopotamus)——[2,5]


向量之间是可以比较的,只需要测量查询向量和文档向量之间的角度就可以得到每个文档的相关度,文档1与查询之间的角度最大,所以相关度低;文档2与查询间的角度较小,所以更相关;文档3与查询的角度正好吻合,完全匹配。

在实际中,只有二维向量(两个术语的查询)可以在平面上表示,幸运的是,线性代数——作为数学中处理向量的一个分支——为我们提供了计算两个多维向量间角度工具,这意味着我们可以使用如上同样的方式来解释多个术语的查询。

关于比较两个向量的更多信息可以在 余弦近似度(cosine similarity) 中看到

现在我们讨论了分数计算的基本理论,我们可以继续了解Lucene是如何实现分数计算的。

0 个评论

要回复文章请先登录注册