构建一个文本搜索系统

说明:文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译,是我对课程的理解。


1 TR的主要构成

构建一个文本搜索系统_第1张图片

 在文章中文本检索系统=全文检索系统=TR System
 从图中看到(红色的方框)TR的主要过程有:分词(Tokenizer)、索引(Indexer)、打分(Scorer)、反馈(Feedback) 四个部分。
 如果把用户发起搜索操作得到检索结果这一过程称为线上(Online),其他时间称为线下(Offline),那么这四个步骤的时间段分布分别为:

操作 时段
分词 线上、线下
索引 线下
打分 线上
反馈 线上、线下

 接下来的内容会介绍这四个方面。

2 分词

 分词的时候需要把有相近意思的词合并在同一个索引项中。关于这一点在工作中实际上是查询的时候合并的同义词。这个之后可以测试一下。
 提取词干。将所有变形的词变为同一个词。例如:computer->compute;computation->compute;computing->compute。
 分词算法:不同语言分词算法不同,分词难度也不同。

3 索引

 索引是把文档变为一种便于快速查找的数据结构。其中最主要的一种思想是倒排索引(Inverted index)。倒排索引是以词作为关键词,记录词出现的文档编号,以及在文档中的词频、位置等信息。

词的经验分布

 无论哪种语言,都会有些词分布特别频繁,而有些词很少用。在一项调查中显示,以词出现次数从多到少排序。最前面的4个词的出现次数,占比10%-15%;最前面的50个词的出现次数,占比35-40%。
 Zipf’s Law很好的描述了这种现象。
  rankfrequencyconstant 词出现的位置与词频乘积几乎等于一个常数。
 构建一个文本搜索系统_第2张图片

创建索引

数据量大的问题

 数据量大的问题:mapreduce 分布式索引

索引压缩

 词频压缩:词频多是小数字。java中int原本占用相同的字节数,经过压缩后小数字占用较少的字节,大数字占用较多的字节。总体上占用较少的字节。
 Doc ID 压缩:文档id是连续的数字,例如:2、3、4….. 使用”d-gap”压缩。存储形式是:d1、d2-d1、d3-d2。这种方法比较适合序列读取。
 具体的压缩算法有:Binary code, unary code, γ -code, δ -code…可以通过wiki学习。

索引解压缩

 压缩后的数字在搜索过程中是一定要通过解压缩步骤,才能读到的。不同的压缩算法,对应不同的解压步骤。
 

4 搜索之打分

 打分是搜索中很重要的一部分。其实这部分的内容是快速搜索,包含打分和优化查询速度两个部分。

打分Score

 一个通用的打分模型: f(q,d)=fa(h(g(t1,q,d),...,g(tk,q,d)),fd(d),fq(q))
 1 fd(d) 是关于文档的打分,提前计算好的。
 2 fq(q) 是关于查询的打分,也是提前计算好的。
 3 g(ti,q,d) 是关于其中一项命中词的打分。
 4 h 是所有命中词打分的累加和。
 5 fa fd,fq,h 三个值的函数,是最终得到的函数。
 这里就具体用到了某一种计算相关度的算法。其中一种就是之前文章提到的VSM。

优化查询速度

 策略1:缓存。把搜索结果、倒排索引表缓存起来。
 策略2:并行搜索。在数据量大的时候使用并行搜索。

5 反馈

 这部分内容会比较多,单独一篇文章讲。

你可能感兴趣的:(信息检索)