你天天用的搜索引擎是怎么工作的
学习资料:
生活中我们已经离不开互联网,而互联网也离不开一门技术,这种技术在早期的互联网中发挥着决定性的作用,它连接着人与人,人与网。它,就是我们的搜索引擎。欢迎来到莫烦Python,我是周沫凡,今天我们来聊一聊你每天都用到的搜索引擎是如何工作的。
搜索引擎¶
在早期互联网时代,世界上诞生了一个影响全世界的公司,Google,它所带来的搜索也突破老一代的技术,登上了历史舞台,并影响着后续2-30年的人类社会发展。华人比较熟悉的百度则是在稍后一些,为中文搜索带来了前所未有的体验。你以为google和百度就是我们搜索引擎的全部吗?其实搜索也不仅仅出现在这些典型的网页入口,他们已经悄然渗透进了我们生活的更多方面。
垂类搜索¶
搜个社交,点个外卖,查个账款,旅个游,这些生活中的服务体系,早已经深度嵌入了我们一天中每一个时间点,对应上了会发生在我们生活的每一个行为。当别人在谈论搜索引擎的时候,可能已经不再是谈论google百度这样的搜索入口了,那千千万万个长在垂类应用里的搜索,才是组成我们今天生活获取信息的主要入口。
你是不是突然发现,原来搜索的应用这么广泛~那么搜索引擎又是怎么做到把零散的信息组织起来的呢?今天我们就来揭开它这层神秘面纱。
构建索引¶
在一篇文章可以被搜索之前,搜索引擎将对他们进行细致的观察,因为它可不想把全部的信息,不分重点的一股脑存储下来。取而代之,它会挑选重点部分,分别对待,比如重点关注标题、时间、正文。将这些信息给予不同的权重后,接着就是下一步,将它存储起来。
搜索引擎通常在搜索的时候,不会临时从全网找材料,而是将刚刚收集到的信息提前构建成索引,存储在便于快速检索的数据库中。只在自己的数据库中搜索,使我们的及时搜索更有效率。
如果你的网页内容有更新,你可以选择自己主动告诉搜索引擎“我更新了内容”,或者等待它定时用蜘蛛来爬取你的更新信息。是的,搜索引擎他们家,最有趣的“宠物”就是蜘蛛了。他们养着成千上万的蜘蛛,每天都在各类网站上爬行着,收集所有能够爬的网络信息。然后将这些信息都放入自己的数据池中,等待我们通过搜索来获取。
目前我们都只是提到了搜索引擎对于文字信息的理解。那当我们搜索图片或者视频的时候,它又是怎么处理的呢?
在深度学习还没有进入黄金年代的时候,大多的图片和视频搜索都是以文字形式记录的。也就是说在数据库中构建索引的时候,搜索引擎对图片和视频并不敏感,它为图片和视频构建的索引都是基于它们周围的文字信息,比如视频的标题等。
数值匹配搜索¶
但是现在的深度学习给我们提供了另一条思路,也就是用模型从非文字的信息中提取计算机能够识别的可计算信息(具体怎么计算,我们在之后的视频中会介绍)。 在用户用文字搜索时,将搜索的文字内容转换成深度学习能识别的数字内容,然后再和之前存储的图片、视频数字信息进行匹配,对比两种数字之间的关联性,然后找到最相近的内容。这种搜索,我们有一个专业名词叫作多模态
搜索。
多模态搜索并不仅限于文字搜图片视频,它还能颠倒过来,用图片搜图片,图片搜视频等,因为在深度学习看来,只要它们能被转换成统一的数字形态,我就能对比相似性。
接下来我们从技术层面分析一下,你用文字搜文字时,究竟会发生什么呢。
搜索过滤¶
虽然我们知道今天的深度学习技术可以识别文字,进行文字相似性的打分,排序。但是深度学习模型有一个速度的硬伤,相比传统方法,每一次预测需要消耗更多的时间。而用户是无法忍受搜索中的延迟。为了实现在海量网页和文件中的快速搜索遍历,我们不得不使用到更加传统的方法, 而把深度学习方法放到后续更加适合的步骤中。
目前比较常用的方式,类似于这里的层层筛选过滤的方式,将筛选结果用不同的方法,从海量的网页中,一层层过滤到最符合你搜索条件的结果。而在需要做大量文档过滤处理的阶段,我们就使用时间消耗相对较少的技术,最后可以把深度学习方案,放在文档量和计算量都少的地方。接下来我们就介绍一下,什么样的技术能在数据量庞大的地方,又快又准地帮你找到搜索内容。
正排/倒排索引¶
我们总说自然语言处理(NLP)会让计算机懂得文字的内涵,但是有时候,有更加投机取巧的方法可以让计算机在不理解文字内涵的时候,还能给我们快速带来准确的结果。特别是在搜索中不得不提到的倒排索引技术。倒排索引是一种批量召回技术,它能快速在海量数据中初步召回基本符合要求的文章。
假设你开了家咨询公司,手上有100篇材料。这时有人来找你咨询NLP的问题,你会怎么在这100篇材料中找到合适的内容呢?
方法1:我们一篇一篇地阅读,找到所有包含NLP内容的材料,然后返回给提问者。这种方法需要我们在每次搜索的时候,都对所有材料进行一次阅读,然后在材料中找到关键词,并筛选出材料,效率其实非常差。
方法2:我们在第一次拿到所有材料时,把它们通读一遍,然后构建关键词和文章的对应关系。当用户在搜索特定词的时候,比如“红”,就会直接返回“红”这个【关键词索引】下的文章列表。先构造索引的好处就是能够将这种索引,放在后续的搜索中复用,搜索也就变成了一种词语匹配加返回索引材料的过程。
这里的 方式1是我们所谓的正排索引,方式2是更加快速的倒排索引。但当处理的是海量数据的时候,通过倒排索引找到的文章可能依然是海量。如果能有种方法对这些文章进行排序操作,再选取排名靠前的文章列表也能帮我们节省大量的时间。处理匹配排序,最有名的算法之一叫做TF-IDF。
TF-IDF¶
先来看看TF-IDF所处的位置是哪里吧,有了批量性地召回相对合适的内容后,比如我已经从1亿个网页中召回了100万个,但100万对于我来说,已经够让我看上好几年了。怎么能再继续提升一下精确度,找到我更在乎的内容呢?
那么对筛选出来的内容做一个【问题与内容】的相似度排序,只返回那些头部内容就好啦。这个工作显然还是有一定的计算量的,所以如果前面不做召回,在1亿个网页中直接用打分排序的逻辑,往往还是挺久的。所以最好是将召回作为初步筛选,然后再相似度打分找到我在乎的内容,从而减轻计算负担。
直接看TF-IDF的名词解释,可能比较晦涩难懂。一个是词频,一个是逆文本频率指数,Oh Nooo, 反正我当初是没有一遍看懂。我来说人话。如果是你,在将搜索问题当中的词与文章中的词比对时,我们可能要找到文章中的关键词才能比较好对比,那么你怎么确定文章中哪些词是重要的。或者一篇文章,它可以用哪些词表达出来?
有人会说,在一篇文章中,越重要的内容,强调的次数也越多,所以频率(TF)会大,我们可以用词频高的词代表这篇文章。所以TF可以用一张词和文章标号的表来展示。不过问题来了,像语气词或“你我他”这种词,同样也会出现很多次,光用TF,我们没办法除去这些词的影响。而TF-IDF中的IDF,就可以在这个时候帮上忙,它是所有词在这个系统中的区分力的大小,如果每篇文章里都有“我”这个字,那么它的在任意一篇文章当中的区分力都不强,而如果你关键词搜索的是“莫烦”,那么全网都没有几个叫“莫烦”的,“莫烦”IDF就会很大,意味着“莫烦”的区分力也够强。
如果说TF是以文章为中心的局部词信息,那么IDF则是全局的词信息。TF无法得知哪些词在全局中算垃圾词,但IDF可以呀。要不把它们俩结合一下?当然行,如果把TF和IDF变成相亲相爱的一家人,结合他们俩不同的优势,就能用TF-IDF信息来表达一篇文章啦。
TF-IDF 两者结合其实就是两者相乘的意思,这样的结果意味着所有的文章,都能用一串集合所有词的分数来表示。通过分数的高低,我们也能大概看出这篇文章的关键内容是什么。比如第一篇,虽然TF告诉我们文章中“爱”这个字最多,但是IDF却告诉我们“莫烦”在文章中更具有代表性,所以根据TF-IDF的结合,这篇文章更具有“莫烦”属性。我们在搜索时又都经历了什么呢?
假设我们搜索关键词“莫烦Python”,机器会利用词表的模式计算“莫烦Python”这个问题的TF-IDF值。然后会计算问句和每篇文章的cosine距离,这个例子中的计算过程,简单来说,就是将文章按照词的维度放到一个四维空间中,(这里我画不了四维,我就用个三维空间说明一下)然后把问句同样也放到这个空间里,最后看空间中这个问题离哪一个文章的距离最近,越近则相似度越高。通过这样的方式呢,我们就能找到搜索问题的最佳匹配文章了。
说到这里,我不得不提到一个在NLP问题中非常重要的东西,那就是向量。我们刚刚把问句或者是文章,用数字的模式,投射到空间中,都是将问句或文章转变成向量,然后按照向量的模式指向空间中的某个位置。
举个例子,第一串数字就是文章1的向量表达,第二串是文章2的向量表达,第三串是问题的向量表达。他们都是空间中的点。(以后当我们接触到NLP模型的时候,你会不断听到词向量,句向量,文章向量等等不同的向量表达形式。)而今天我们虽然没有用深度学习,但是TF-IDF何尝不也是一种向量表达形式呢?在后续的教学中,我们再继续探索NLP当中有趣的向量表达和应用吧。
我们今天认识了搜索引擎的基本原理,但是现实中的搜索引擎可不仅仅只有倒排索引和TF-IDF,它还汇集了更多人类智慧的精华,值得我们进一步探索。