一、向量空间模型

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”等词的词频肯定高。文档 布尔莎模型转换 python_倒排索引 中关键词 布尔莎模型转换 python_TF-IDF_02布尔莎模型转换 python_向量空间模型_03 值的计算公式为布尔莎模型转换 python_余弦相似度_04

其中布尔莎模型转换 python_TF-IDF_05表示 布尔莎模型转换 python_倒排索引 文档的词数,布尔莎模型转换 python_TF-IDF_07 表示 布尔莎模型转换 python_TF-IDF_02 在文档 布尔莎模型转换 python_倒排索引

IDF

对于第二个问题,一般不重要的词,例如“I”、“the”、“and”这种,在所有文章里面都会出现的词,它们的重要性一定很低。相反地,在很少文章中出现的词,对于搜索引擎来说价值更高。我们可以使用反向文档频率Inverse Document Frequency作为该特性的评价指标。文档频率Document Frequency是包含某单词的文档个数,布尔莎模型转换 python_布尔莎模型转换 python_10 则是 布尔莎模型转换 python_布尔莎模型转换 python_11 的呈负相关的变式。对于单词布尔莎模型转换 python_TF-IDF_02来说,它的 布尔莎模型转换 python_布尔莎模型转换 python_10 值计算公式为布尔莎模型转换 python_向量空间模型_14布尔莎模型转换 python_余弦相似度_15
其中,布尔莎模型转换 python_倒排索引_16为所有文档的总数。

TF-IDF

TF和IDF的积,可以作为某个词在某篇文档中的重要性衡量,既然如此,我们就可以用TF和IDF表征整个文本空间的所有单词重要性,因而可以用布尔莎模型转换 python_向量空间模型_17矩阵的方式表示整个文本空间:布尔莎模型转换 python_倒排索引_18
如果一个词在所有文档中出现(如 “the”),它的 布尔莎模型转换 python_布尔莎模型转换 python_10 值为0,在 布尔莎模型转换 python_向量空间模型_17 矩阵中值也将为0;如果一个词 布尔莎模型转换 python_TF-IDF_02 在文档 布尔莎模型转换 python_倒排索引 中未出现,相应地,它的 布尔莎模型转换 python_向量空间模型_03 值为0,布尔莎模型转换 python_向量空间模型_17

1.3 相似度计算

1.3.1 内积

在文档和查询中同时出现的词将获得更高的得分,因此文档 布尔莎模型转换 python_TF-IDF_25 和 查询 布尔莎模型转换 python_TF-IDF_26 的相似程度能够以内积方式表示布尔莎模型转换 python_余弦相似度_27

1.3.2 余弦相似(主流)

尽管内积某种程度上表示了文档相似程度大小,但是它对短查询/短文章并不公平,长文章有更多的单词,可能会产生更多的匹配,但相关程度却不一定有短文章高。因此我们不应只从内积角度,而应该从方向的角度去分析Query和Document的相似。余弦相似的公式如下:布尔莎模型转换 python_布尔莎模型转换 python_28
这里举个例子,假设有两个文档 布尔莎模型转换 python_倒排索引_29 布尔莎模型转换 python_向量空间模型_30 和查询 布尔莎模型转换 python_TF-IDF_26, 关键词为 布尔莎模型转换 python_向量空间模型_32 布尔莎模型转换 python_余弦相似度_33 布尔莎模型转换 python_布尔莎模型转换 python_34, 满足布尔莎模型转换 python_向量空间模型_35
那么有 布尔莎模型转换 python_余弦相似度_36
布尔莎模型转换 python_向量空间模型_37

1.3.3 其他指标

  • Jaccard 系数 布尔莎模型转换 python_向量空间模型_38
  • Dice 系数 布尔莎模型转换 python_向量空间模型_38

二、倒排索引

2.1 基本概念

倒排索引在搜索引擎中有着举重若轻的地位。大名鼎鼎的elasticsearch,及其底层框架luncene就是基于倒排索引实现。与正向索引相对,倒排索引以关键词为索引,映射到某个单词在一个文档或者一组文档中存储的位置。可以根据单词快速获取包含整个单词的文档列表。如下图例子,computer一词在Document 1中的第23、97和104个位置以及Document 3 的第43个位置出现,graph一词在Document 2的第5个位置以及Docuemtn 3的第44个位置出现。

布尔莎模型转换 python_向量空间模型_40


为了提高效率document index一般用排序树(如b树)的形式存储,访存时间复杂度可以从线性优化为对数级别。且存储的数据可以为前缀树,进一步节省非叶节点存储消耗。

布尔莎模型转换 python_布尔莎模型转换 python_41

2.2 how to work?

构建

  • 构建文档时,先对文档进行编号,形成文档列表。
  • 对每一个文档的数据进行分词,构建字典,并对字典进行编号,以关键词创建索引。然后记录包含该单词的所有文档编号以及位置信息。

使用

  • 对查询分词
  • 使用分词结果去倒排索引列表中进行匹配,返回包含词条的所有文档编号(及位置信息)。
  • 根据文档编号和位置信息到文档列表中锁定原文信息。

2.3 好处

  1. 对布尔模型的消息回溯系统,倒排索引能快速锁定包含关键词的文档集合,效率非常高。锁定文档集合后直接进行与或非计算即可。
  2. 对概率模型来说,倒排索引方便了tf-idf值的计算,并且支持词组查询。

2.4 缺点

  • 花费了存储开销在posting list上(或超过100%)
  • 高昂的增、删、改费用。尽管对word index的查询很快,但是在posting list中修改的时间复杂度是线性级别,文档数目多的时候这个消耗是非常大的。
  • 布尔模型中的花销随查询条件增加陡增

因为快考试就不水太多字了,如果读者有问题的可以在评论区提问,我有空会一一解答。