惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Troy Hunt's Blog
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - Franky
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Martin Fowler
Martin Fowler
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Azure Blog
Microsoft Azure Blog
云风的 BLOG
云风的 BLOG
G
Google Developers Blog
WordPress大学
WordPress大学
腾讯CDC
J
Java Code Geeks
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美
博客园 - 【当耐特】
小众软件
小众软件
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
罗磊的独立博客
Schneier on Security
Schneier on Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
TaoSecurity Blog
TaoSecurity Blog
H
Heimdal Security Blog
Blog — PlanetScale
Blog — PlanetScale
Forbes - Security
Forbes - Security
B
Blog
I
InfoQ
D
DataBreaches.Net
月光博客
月光博客
T
Tenable Blog
S
Security Affairs
C
Check Point Blog
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - ~大器晚成~

我的2012 一个非重点校计算机专业毕业生的求职之路 Vim设置 推荐系统的循序进阶读物(从入门到精通) Hadoop 常见错误汇总 (转载) 信息检索技术——向量空间模型 排序算法——堆排序 查找算法——找到序列中第二大的数(修正版) Hadoop 实现多个数据表的join操作 排序算法——快速排序 排序算法——冒泡排序 排序算法——选择排序 牛×的可视化排序 shell常用技巧 排序算法——插入排序 机器学习相关——文本分类综述 大公司 or 小公司 使用gdb进行调试高级篇 使用gdb进行调试中级篇
信息检索技术——布尔检索
~大器晚成~ · 2012-03-27 · via 博客园 - ~大器晚成~

前一阵子和大家分享了一系列排序算法,希望对大家能够有一些帮助。从今天开始,本人打算开展一个新的领域,介绍一下信息检索相关的技术。信息检索技术可以说现如今发展非常迅速,使用也极其广泛,甚至可以说是随处可见。特别是做一些跟搜索引擎,机器学习相关工作时,信息检索的知识无处不在。为了让大家更好的理解信息检索技术,我将分多次对信息检索技术做一个尽可能细致的阐述,难度由浅及深,欢迎大家多多拍砖。

今天先介绍最简单的信息检索技术,布尔检索。

信息检索(IR),通俗的讲,就是要在一个很大的文本(有时可能是其他数据,如图像等)集合中,找到与用户需求相关的可以满足用户需求的非结构化信息。听起来有点拗口,其实就是一种查询,只不过查询的对象是非结构化信息,和查询数据库中的表并不相同。希望这么说能好理解一些。

既然要从文档中找到符合用户需求的信息,那么首先就要解决一个问题,就是如何来表示文档呢?在信息检索中,我们通常使用1代表一个word出现在文档中,0代表没有出现在文档中,很简单。

比如 文档1: I often go to school by bus. 文档2: I am wating for the bus for 20 minutes.

我们如何来用1和0来表示上面的文档呢?很容易想到的方法是将所有的文档和word组成一个矩阵,X方向为文档,Y方向为所有的单词。

    文档1  文档2  文档3  文档4  ...

I     1    1    0    0

often  1    0    0

go    1    0    0

to     1      0     0

school     1     0    0

by          1    0    0

bus         1    1    0

am          0    1    0

...

这样很容易的就表示了所有的word和文档的对应关系,当用户要查询检索bus时,只需要找到bus对应的行,将是1的文档都取出来,展现给用户不就行了?

确实,这样做可以完成检索的需求,但是仔细想想不难发现,我们假设一篇文档有1000个word,一个文档集有1亿篇文档(这对于搜索引擎来说还远远不够),那么我们需要用1*1011的矩阵来保存这种关系,这对计算机来说显然是无法承受的。

那我们有什么办法来进行优化呢?仔细想想可以看出,虽然数据量很大,但是这个矩阵是极其稀疏的,也就是说1的个数是很少的,绝大多数位置都是0.那么我们为什么要保存那么多的0来占用空间呢?这完全没有必要。于是,著名大倒排索引诞生了。

在介绍倒排索引前,先说正排索引,正排索引就是给定一个文档,可以知道文档中出现的所有word。对比着看,倒排索引就是反过来,给定一个word,看看这个word出现在哪些文档中。下面的图形象的描述了倒排索引的数据结构

I -> 1 2 3 4 5 7 9 22

school -> 1 3

bus -> 1 2 8 9

其中前面的是word,后面的是文档的标号,并且这些标号是按顺序存放的,这更利于后面检索环节的处理。当然上面提到的是最基本的原型,实际的系统中,倒排索引还保存了词频,网页的元数据等各种信息。

有了倒排索引,我们就可以省去大量的空间,大大提高了查询检索的效率。下面我们看看如何进行检索。比如我们有了如下的倒排索引

A -> 2 4 8 16 32 64

B -> 1 2 4 9 16 33

先在用户查询A,那么则返回2 4 8 16 32 64

如果查询A and B 则需要把A和B的倒排索引拿出来,进行一次求交集的运算。其实很简单,只需要O(x+y)的时间操作,就可以得到2 4 16了。

如果用户查询A or B呢?不用我多说了吧,相信大家已经很明白该如何处理了。

以上是本人对布尔检索的一个简单的说明,欢迎大家指正。谢谢