构建一个文本搜索系统
2017-08-17 22:18
141 查看
说明:文章内容来源于课程视频和课程ppt。我只学习了课程没有做习题。文章不是翻译,是我对课程的理解。
在文章中文本检索系统=全文检索系统=TR System
从图中看到(红色的方框)TR的主要过程有:分词(Tokenizer)、索引(Indexer)、打分(Scorer)、反馈(Feedback) 四个部分。
如果把用户发起搜索操作得到检索结果这一过程称为线上(Online),其他时间称为线下(Offline),那么这四个步骤的时间段分布分别为:
接下来的内容会介绍这四个方面。
提取词干。将所有变形的词变为同一个词。例如:computer->compute;computation->compute;computing->compute。
分词算法:不同语言分词算法不同,分词难度也不同。
Zipf’s Law很好的描述了这种现象。
rank∗frequency≈constant 词出现的位置与词频乘积几乎等于一个常数。
Doc ID 压缩:文档id是连续的数字,例如:2、3、4….. 使用”d-gap”压缩。存储形式是:d1、d2-d1、d3-d2。这种方法比较适合序列读取。
具体的压缩算法有:Binary code, unary code, γ-code, δ-code…可以通过wiki学习。
1fd(d)是关于文档的打分,提前计算好的。
2fq(q)是关于查询的打分,也是提前计算好的。
3g(ti,q,d)是关于其中一项命中词的打分。
4h是所有命中词打分的累加和。
5fa是fd,fq,h三个值的函数,是最终得到的函数。
这里就具体用到了某一种计算相关度的算法。其中一种就是之前文章提到的VSM。
策略2:并行搜索。在数据量大的时候使用并行搜索。
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 反馈
这部分内容会比较多,单独一篇文章讲。相关文章推荐
- nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)
- 全文搜索(A-3)-推荐系统构建步骤
- 介绍一个关于如何使用vs2005构建三层系统的教程
- 基本上包含了Foudation框架内的所有函数和方法。 使用方法:全选,自己建一个文本类的文件,如果要使用某个方法却想不起来方法名,直接在文本中搜索关键字即可。
- 基于 RabbitMQ 构建一个类似 Resque 的作业处理系统
- (转)menuconfig的执行流程,构建一个menuconfig系统的方法
- 视频版|如何构建一个好的资产管理系统(CMDB)
- Android编译系统中头文件搜索路径顺序的一个问题
- linux grep命令 1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Express
- 【转帖】menuconfig的执行流程,构建一个menuconfig系统的方法
- 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)
- mongo文本搜索的一个例子
- 用Elasticsearch构建电商搜索平台,一个极有代表性的基础技术架构和算法实践案例[转]
- 打造一个全命令行的Android构建系统
- 如何逐步去构建一个大型网站系统
- 手动构建一个小linux系统
- 一个完整的搜索系统
- 【4】构建基于scikit-learn的文本挖掘学习系统
- 如何开发一个异常检测系统:使用什么特征变量(features)来构建异常检测算法
- 构建一个可行的BI系统的造价是多少,实施周期?具备条件基础是什么? 数据量有要求么