您的位置:首页 > 其它

构建一个文本搜索系统

2017-08-17 22:18 141 查看
说明:文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译,是我对课程的理解。

1 TR的主要构成



 在文章中文本检索系统=全文检索系统=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很好的描述了这种现象。

 rank∗frequency≈constant 词出现的位置与词频乘积几乎等于一个常数。

 


创建索引

数据量大的问题

 数据量大的问题: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))

 1fd(d)是关于文档的打分,提前计算好的。

 2fq(q)是关于查询的打分,也是提前计算好的。

 3g(ti,q,d)是关于其中一项命中词的打分。

 4h是所有命中词打分的累加和。

 5fa是fd,fq,h三个值的函数,是最终得到的函数。

 这里就具体用到了某一种计算相关度的算法。其中一种就是之前文章提到的VSM

优化查询速度

 策略1:缓存。把搜索结果、倒排索引表缓存起来。

 策略2:并行搜索。在数据量大的时候使用并行搜索。

5 反馈

 这部分内容会比较多,单独一篇文章讲。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  全文检索
相关文章推荐