说明:文章内容来源于课程视频和课程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))
1
fd(d)
是关于文档的打分,提前计算好的。
2
fq(q)
是关于查询的打分,也是提前计算好的。
3
g(ti,q,d)
是关于其中一项命中词的打分。
4
h
是所有命中词打分的累加和。
5
这里就具体用到了某一种计算相关度的算法。其中一种就是之前文章提到的VSM。
优化查询速度
策略1:缓存。把搜索结果、倒排索引表缓存起来。
策略2:并行搜索。在数据量大的时候使用并行搜索。
5 反馈
这部分内容会比较多,单独一篇文章讲。