渣翻:搜索引擎算法基础
Posted 程序员木头的悲惨生活
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渣翻:搜索引擎算法基础相关的知识,希望对你有一定的参考价值。
搜索引擎并不是尽量返回与输入查询最匹配的一些页面。一个好的搜索引擎会试着回答那些底层的问题。若是你意识到了这一点,你便会理解为什么谷歌(以及其它搜索引擎)用一个非常复杂的算法来决定他们应该返回的结果。算法中的因子包括诸如页面反向链接数量的“硬因素”,也许还有一些通过喜欢和+1的社交推荐。这些通常是外部影响,还会有页面本身的因素。为此,构建页面的方式以及各种页面元素都要在算法中起到作用。但是只有通过全部分析现场以及非现场因素,Google才有可能确定哪些页面会会的查询背后的问题。因此,Google必须分析页面上的文字。
在本文中,我会详细阐述有关搜索引擎及其可选解决方案的一些问题。(很遗憾)到了文章末尾我们也没有透漏谷歌的算法,但是我们可以更进一步理解一些我们作为一个SEO(Search Engine Optimizers,搜索引擎优化工程师)经常给出的建议。会有一些公式,但是不要惊慌。本文并不仅仅是关于那些公式。文章包含一个excel文件。噢,最好的是:我会用一些荷兰美食来介绍这些问题。
看哪:Croquets是细长的而bitterballen是圆形的; -) 【Croquets:可乐饼 bitterballen:奶油肉丸 】
真或假
搜索引擎近些年来发展迅速,但是起初它们只能处理布尔操作值。简单来说,就是一个词是否包含在文档中。有些事情就是真或假,1或者0。另外你还能使用比如AND(且),OR(或)以及NOT(非)的操作符,去搜索包含多个词语或者排除一些词语的文档。这听起来相当简单,但是它确实也有一些问题。假设我们有两个文档,包含如下文本:
文档1:
"And our restaurant in New York serves croquets and bitterballen."
文档2:
"In the Netherlands you retrieve croquets and frikandellen from the wall."
噢,差点忘了给你展示一下frikandellen了 ;-)
如果我们要构建一个搜索引擎,第一步就是把文本标记化。我们想要能够快速地定位到哪个文档包含条件词。如果我们把所有的“标记”(token)放入到数据库中,这会更容易一些。一个“标记”(token)可以是一个文本里的任意一个单独的词,那么文档1里有多少“标记”(token)呢?
在你自己开始回答这个问题的时刻,你可能会考虑关于“term”的定义。事实上,在例子中“New York”应该被当做一个term。如何确定这两个单词实际上是一个单词超出了本文的范畴,所以目前我们恐怕还是会把每个分开的单词当作是分开的标记。所以,在文档1中有10个标记,而文档2中有11个标记。为了避免我们的数据库中有重复的信息,我们会去存储“类型”(type)而不是那些标记。
Type是文本中的唯一标记。在文档1的例子中包含了两次"and"这一标记。在这个示例中,我会忽略"and"出现了一次大写以及一次没有大写的事实。与确定词语(term)一样,有技术来确定某些词是否确实需要大写。在这种情况下,我们假设可以在没有大写的情况下进行存储,亦假定“And”和“and”是同一类型。
通过把所有的类型(type)以及可以查找得到的文档存储在数据库中,我们便可以在Boolean(布尔值)的帮助下在数据库中搜索了。搜索"croquets"都会得到文档1和文档2的结果。对于"croquets AND bitterballen"的搜索则只会返回文档1的结果。这种方法的问题是你可能会得到太多或者太少的结果。另外,它缺少了组织结果的能力。如果我们想要提高我们的方法,我们需要确定我们可以使用的,然后是文档中存在/不存在这个词。如果你是Google,会使用哪些页面因素来组织返回结果呢?
Zone Indexes算法
相对简单的方法就是使用zone indexes(区域索引)算法。一个页面可以被分成不同的区域。想一下有一个标题(title),描述(description),作者(author)和主体(body)。通过增加一个文档中每一个区域的权重,我们可以给每个文档都计算下,得到一个简单的得分。这是搜索引擎最初对于网页的方法之一,用于确定页面主题。区域索引的得分算法如下:
假定我们为每个区域增加如下权重:
区域(Zone) | 权重(Weight) |
title | 0.4 |
description | 0.1 |
content | 0.5 |
我们执行如下搜索查询:
"croquets AND bitterballen"
接着我们便会得到有着如下区域的文档:
区域(Zone) | 内容(Content) | 布尔值(Boolean) | 得分(Score) |
title | New York Café | 0 | 0 |
description | Café with delicious croquets and bitterballen | 1 | 0.1 |
content | Our restaurant in New York serves croquets and bitterballen | 1 | 0.5 |
- | - | Total | 0.6 |
因为在某些时候,每个人都开始滥用分配给例如description的权重。对于Google来说,将主体分成不同的区域,并为主体的每个区域分配不同的权重,这是很重要的。
这确实有点困难,因为网页包含具有不同结构的各种文档。然而这种机器对XML文档的解析非常简单。解析一个html文档时,对于一台机器来说就更难了。结构和标签更有限,这使得分析更加困难。当然在不久的将来就会有HTML5以及Google将支持微框架,但是它仍有自己的限制在。譬如,如果你知道了Google给
以上是关于渣翻:搜索引擎算法基础的主要内容,如果未能解决你的问题,请参考以下文章
Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正)