说明:文章内容来源于课程视频和课程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 反馈

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

构建一个文本搜索系统相关推荐

  1. 一文告诉你,如何使用Python构建一个“谷歌搜索”系统 | 内附代码

    来源 | hackernoon 编译 | 武明利 责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统.基本 ...

  2. 如何使用 Python 构建一个“谷歌搜索”系统? | 内附代码

    来源 | hackernoon 编译 | 武明利,责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统.基本 ...

  3. python开发bs系统_一文告诉你,如何使用Python构建一个“谷歌搜索”系统|内附代码...

    来源 | hackernoon 编译 | 武明利 责编 | Carol 在这篇文章中,我将向您展示如何使用Python构建自己的答案查找系统.基本上,这种自动化可以从图片中找到多项选择题的答案. 有一 ...

  4. 所见即搜,3分钟教你搭建一个服装搜索系统!

    摘要:用MindSpore+Jina,基于Fashion-MNIST Dataset搭建的服装搜索系统. 引言 各位算法萌新们,是不是经常训练了模型却不知道如何部署和应用?或者只会调参但不会前端后端所 ...

  5. 程序员,如何逐步去构建一个大型网站系统,面试必问!!!

    往往程序员在面试的时候,公司的面试任职资格上,总有一个大型系统网站的开发经验,我们先来看看几张面试招聘信息截图....... 大型网站定义 首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技 ...

  6. 3.2 实战项目二(手工分析错误、错误标签及其修正、快速地构建一个简单的系统(快速原型模型)、训练集与验证集-来源不一致的情况(异源问题)、迁移学习、多任务学习、端到端学习)

    手工分析错误 手工分析错误的大多数是什么 猫猫识别,准确率90%,想提升,就继续猛加材料,猛调优?     --应该先做错误分析,再调优! 把识别出错的100张拿出来, 如果发现50%是"把 ...

  7. 如何基于 Android Things 构建一个智能家居系统?

    [CSDN 编者按]Android Things 是 Google 在 2016 年底推出的基于物联网的操作系统,广泛运用于物联网设备.本文作者从其技术原理开始,详解了 Android Things ...

  8. 【Java项目】构建一个博客系统

    这篇博客介绍的是一个简单的前端博客系统!!! 该项目主要分成以下四个页面 博客列表页:显示了当前发布出来的博客(标题.时间.内容) 博客编辑页:包括一个输入框,Markdown编辑器(使用第三方组件) ...

  9. 如何构建一个vue登录系统之登录页面

    1. 在assets中新建一个css文件夹和imgs文件夹 2. 在src/views文件夹下新建一个Login.vue页面 3. 在src/main.js中引入全局公共样式文件style_publi ...

最新文章

  1. java map 队列_Java:queue队列,map集合
  2. js中json的添加和指定位置的删除
  3. 网站接入QQ登录最新2020 java版本
  4. scala使用java类_使用Java和Scala将Play Framework 2应用程序部署到Openshift
  5. 白话C++系列(27) -- RTTI:运行时类型识别
  6. android 扫描重复文件,Android Gradle在APK META-INF中复制的重复文件
  7. mingw linux socket,MingW上编译WinSocket程序undefined reference to `WSAStartup@8'报错的解决办法...
  8. RocketMq发送延迟消息
  9. mysql回表查询uuid_MySQL数据库回表与索引
  10. ElasticSearch权威指南学习(索引管理)
  11. ios端 ajax url的一个小问题
  12. php抽象类继承抽象类,PHP抽象类和抽象方法以及接口
  13. 【吴恩达机器学习】学习笔记——4多元线性回归
  14. arch linux 安装 键盘,Arch Linux安装
  15. 1060显卡用什么软件测试,【影驰 GTX 1060 GAMER 显卡使用测试】频率|性能|软件_摘要频道_什么值得买...
  16. LiteIDE中运行GO
  17. 前端 DFA 敏感词过滤
  18. Sqlserver与Oracle 10g数据类型对照
  19. SpringCloud--鸿鹄Cloud分布式微服务云系统
  20. 转载蓝叠模拟器与android studio连接步骤

热门文章

  1. java httpclient发送json 请求 ,go服务端接收
  2. delphi 中几种多线程操作方式
  3. 查看当前提供了哪些引擎
  4. 寄存器指令MIPS 寄存器介绍
  5. C# ASP.NET MVC 微信和支付宝H5支付开发及Demo
  6. all()是python内置函数吗_Python内置函数all(),python
  7. 关于redis实现单点登录的一点思路
  8. cesium面板动态显示并跟随移动
  9. ubuntu18虚拟机添加网卡后,不自动启用dhcp
  10. Oracle常见错误