构建一个文本搜索系统
说明:文章内容来源于课程视频和课程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≈constantrank * frequency \approx constant 词出现的位置与词频乘积几乎等于一个常数。
创建索引
数据量大的问题
数据量大的问题:mapreduce 分布式索引
索引压缩
词频压缩:词频多是小数字。java中int原本占用相同的字节数,经过压缩后小数字占用较少的字节,大数字占用较多的字节。总体上占用较少的字节。
Doc ID 压缩:文档id是连续的数字,例如:2、3、4….. 使用”d-gap”压缩。存储形式是:d1、d2-d1、d3-d2。这种方法比较适合序列读取。
具体的压缩算法有:Binary code, unary code, γ\gamma-code, δ \delta-code…可以通过wiki学习。
索引解压缩
压缩后的数字在搜索过程中是一定要通过解压缩步骤,才能读到的。不同的压缩算法,对应不同的解压步骤。
4 搜索之打分
打分是搜索中很重要的一部分。其实这部分的内容是快速搜索,包含打分和优化查询速度两个部分。
打分Score
一个通用的打分模型:f(q,d)=fa(h(g(t1,q,d),...,g(tk,q,d)),fd(d),fq(q))f(q,d)=f_a(h(g(t_1,q,d),...,g(t_k,q,d)),f_d(d),f_q(q))
1fd(d)f_d(d)是关于文档的打分,提前计算好的。
2fq(q)f_q(q)是关于查询的打分,也是提前计算好的。
3g(ti,q,d)g(t_i,q,d)是关于其中一项命中词的打分。
4hh是所有命中词打分的累加和。
5faf_a是fd,fq,hf_d,f_q,h三个值的函数,是最终得到的函数。
这里就具体用到了某一种计算相关度的算法。其中一种就是之前文章提到的VSM。
优化查询速度
策略1:缓存。把搜索结果、倒排索引表缓存起来。
策略2:并行搜索。在数据量大的时候使用并行搜索。
5 反馈
这部分内容会比较多,单独一篇文章讲。
构建一个文本搜索系统相关推荐
- 一文告诉你,如何使用Python构建一个“谷歌搜索”系统 | 内附代码
来源 | hackernoon 编译 | 武明利 责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统.基本 ...
- 如何使用 Python 构建一个“谷歌搜索”系统? | 内附代码
来源 | hackernoon 编译 | 武明利,责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统.基本 ...
- python开发bs系统_一文告诉你,如何使用Python构建一个“谷歌搜索”系统|内附代码...
来源 | hackernoon 编译 | 武明利 责编 | Carol 在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统.基本上,这种自动化可以从图片中找到多项选择题的答案. 有一 ...
- 所见即搜,3分钟教你搭建一个服装搜索系统!
摘要:用MindSpore+Jina,基于Fashion-MNIST Dataset搭建的服装搜索系统. 引言 各位算法萌新们,是不是经常训练了模型却不知道如何部署和应用?或者只会调参但不会前端后端所 ...
- 程序员,如何逐步去构建一个大型网站系统,面试必问!!!
往往程序员在面试的时候,公司的面试任职资格上,总有一个大型系统网站的开发经验,我们先来看看几张面试招聘信息截图....... 大型网站定义 首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技 ...
- 3.2 实战项目二(手工分析错误、错误标签及其修正、快速地构建一个简单的系统(快速原型模型)、训练集与验证集-来源不一致的情况(异源问题)、迁移学习、多任务学习、端到端学习)
手工分析错误 手工分析错误的大多数是什么 猫猫识别,准确率90%,想提升,就继续猛加材料,猛调优? --应该先做错误分析,再调优! 把识别出错的100张拿出来, 如果发现50%是"把 ...
- 如何基于 Android Things 构建一个智能家居系统?
[CSDN 编者按]Android Things 是 Google 在 2016 年底推出的基于物联网的操作系统,广泛运用于物联网设备.本文作者从其技术原理开始,详解了 Android Things ...
- 【Java项目】构建一个博客系统
这篇博客介绍的是一个简单的前端博客系统!!! 该项目主要分成以下四个页面 博客列表页:显示了当前发布出来的博客(标题.时间.内容) 博客编辑页:包括一个输入框,Markdown编辑器(使用第三方组件) ...
- 如何构建一个vue登录系统之登录页面
1. 在assets中新建一个css文件夹和imgs文件夹 2. 在src/views文件夹下新建一个Login.vue页面 3. 在src/main.js中引入全局公共样式文件style_publi ...
最新文章
- java map 队列_Java:queue队列,map集合
- js中json的添加和指定位置的删除
- 网站接入QQ登录最新2020 java版本
- scala使用java类_使用Java和Scala将Play Framework 2应用程序部署到Openshift
- 白话C++系列(27) -- RTTI:运行时类型识别
- android 扫描重复文件,Android Gradle在APK META-INF中复制的重复文件
- mingw linux socket,MingW上编译WinSocket程序undefined reference to `WSAStartup@8'报错的解决办法...
- RocketMq发送延迟消息
- mysql回表查询uuid_MySQL数据库回表与索引
- ElasticSearch权威指南学习(索引管理)
- ios端 ajax url的一个小问题
- php抽象类继承抽象类,PHP抽象类和抽象方法以及接口
- 【吴恩达机器学习】学习笔记——4多元线性回归
- arch linux 安装 键盘,Arch Linux安装
- 1060显卡用什么软件测试,【影驰 GTX 1060 GAMER 显卡使用测试】频率|性能|软件_摘要频道_什么值得买...
- LiteIDE中运行GO
- 前端 DFA 敏感词过滤
- Sqlserver与Oracle 10g数据类型对照
- SpringCloud--鸿鹄Cloud分布式微服务云系统
- 转载蓝叠模拟器与android studio连接步骤