渣翻:搜索引擎算法基础

这是我参与更文挑战的第8天,活动详情查看:更文挑战java

译者:本文简单介绍了Google搜索引擎的一部分基础知识,在接下来的系列文章里,我也会开始着手更新关于eslasticsearch的一些入门指北和结合 java 的 rest client的一些实际使用,敬请期待!web

原文地址:moz.com/blog/search…算法

引擎并非尽可能返回与输入查询最匹配的一些页面。一个好的搜索引擎会试着回答那些底层的问题。如果你意识到了这一点,你便会理解为何谷歌(以及其它搜索引擎)用一个很是复杂的算法来决定他们应该返回的结果。算法中的因子包括诸如页面反向连接数量的“硬因素”,也许还有一些经过喜欢和+1的社交推荐。这些一般是外部影响,还会有页面自己的因素。为此,构建页面的方式以及各类页面元素都要在算法中起到做用。可是只有经过所有分析现场以及非现场因素,Google才有可能肯定哪些页面会会的查询背后的问题。所以,Google必须分析页面上的文字。数据库

在本文中,我会详细阐述有关搜索引擎及其可选解决方案的一些问题。(很遗憾)到了文章末尾咱们也没有透漏谷歌的算法,可是咱们能够更进一步理解一些咱们做为一个SEO(Search Engine Optimizers,搜索引擎优化工程师)常常给出的建议。会有一些公式,可是不要惊慌。本文并不只仅是关于那些公式。文章包含一个excel文件。噢,最好的是:我会用一些荷兰美食来介绍这些问题。markdown

food1.jpeg

看哪:Croquets是细长的而bitterballen是圆形的; -) 【Croquets: 可乐饼 bitterballen: 奶油肉丸 】框架

真或假

搜索引擎近些年来发展迅速,可是起初它们只能处理布尔操做值。简单来讲,就是一个词是否包含在文档中。有些事情就是真或假,1或者0。另外你还能使用好比AND(且),OR(或)以及NOT(非)的操做符,去搜索包含多个词语或者排除一些词语的文档。这听起来至关简单,可是它确实也有一些问题。假设咱们有两个文档,包含以下文本:编辑器

文档1:
"And our restaurant in New York serves croquets and bitterballen."ide

文档2:
"In the Netherlands you retrieve croquets and frikandellen from the wall."oop

frikandellen.jpeg

噢,差点忘了给你展现一下frikandellen了 ;-)post

若是咱们要构建一个搜索引擎,第一步就是把文本标记化。咱们想要可以快速地定位到哪一个文档包含条件词。若是咱们把全部的“标记”(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给标签中内容分配了更多的权重,而且给

标签中的内容减了权重,那么你就毫不会再用标签了。

为了断定一个网页的内容,Google将不得不把一个web页面分块处理。这种方式下,Google就能判断页面上的哪一块是重要的而哪一块不是。能使用的方法之一即是文本/代码的比率。一个页面中的某一块含有的文本比HTML代码更多,就有多是网页的主要内容。含有许多超连接或者HTML代码且不多内容的页面块有多是菜单部分。这也是为何选择正确的富文本编辑器是很是重要的。其中的一些编辑器用了不少没必要要的HTML代码。

文本/代码比率的使用只是搜索引擎能够用来将页面划分为块的方法之一。Bill Slawski 在今年早些时候也谈到了识别块

区域索引算法的优势是你能够为每一个文档都计算一个简单的得分,缺点固然就是许多文档可能获得相同的分数。

Term frequency 词频

当我让你去想一下页面上你会用来肯定文档关联的因素的时候,你可能会想到搜索词的频率。为使用搜索词更频繁的文档增长权重是合乎逻辑的一步。

一些SEO坚信那些在文本中使用特定百分比关键词的故事。咱们都知道那不是真的,但仍是让我来展现一下为何。我会尽可能用如下示例的基础上解释。接下来会出现一些公式,但如我所说,故事的概要是重点。

下面表格中的数字即是单词在文档中出现的次数(也可称做词频或者tf)。那么那个文档对于查询“croquets and bitterballen”有更高的得分呢?

document croquets and café bitterballen Amsterdam ...
文档1 8 10 3 2 0
文档2 1 20 3 9 2
文档N ... ... ... ... ...
查询 1 1 0 1 0

两个文档的得分以下计算得来:
score(“croquets and bitterballen”, Doc1) = 8 + 10 + 2 = 20
score(“croquets and bitterballen”, Doc2) = 1 + 20 + 9 = 30

这种状况下文档2显得更符合查询(条件)。在这个例子中,单词“and”获得了最大的权重,但这是公正的吗?这是一个中止词,而且咱们只想给它很小的值。咱们能够经过使用逆文档频率(tf-idf)来解决这一点,即与文档频率(df)相反。文档频率是指出现一个词的文档数量。逆文档频率,那么,即是对立面。随着出现单词的文档数量的增加,idf就会缩小。

你能够经过将语料库中文档的总数除以包含该词的文档数,而后取商的对数来计算idf。

假设咱们搜索词的idf以下:
Idf(croquets) = 5
Idf(and) = 0.01
Idf(bitterballen) = 2

那么你便会获得下面的得分:
score(“croquets and bitterballen”, Doc1) = 85 + 100.01 + 22 = 44.1
score(“croquets and bitterballen”, Doc2) = 1
5 + 200.01 + 92 = 23.2

如今文档1获得了更高的得分。但目前咱们也没有将长度考虑在内。一个文档能够包含比另外一个多得多的内容,而非更有相关性。一个长文档用这种方法获得高分是至关容易的。

Vector model 向量模型

咱们经过查看文档的余弦类似性来解决这个问题。对于此方法背后理论的准确解释超出本文的范围,可是你能够将其看做是文档中查询关键词之间的一种调和均值。我作了一个Excel文件,因此你能够自行研究。文件自己有一个说明。你须要(了解)下面的指标:

  • Query terms(查询词)-在查询条件中每个分离的词。
  • Document frequency(文档频率)-Google知道有多少文档包含那个词吗?
  • Term frequency(词频)-文档中每一个单独查询词的频率(将Sander Tamaëla制做的焦点关键字小部件添加到书签中,对此部分很是有帮助)。

这有一个我实际使用这个模型的例子。该网站有一个网页旨在为“buying bikes”取得排名,荷兰语为“fiets kopen”。问题在于错误页(主页)正为查询获取排名。

公式的话,咱们以前提到了逆文档频率(idf)。为此咱们须要Google索引中文档的总数。那么咱们假设N=104亿。

下表的解释说明:

  • tf = term frequency(词频)
  • df = document frequency(文档频率)
  • idf = inverse document frequency(逆文档频率)
  • Wt,q = weight for term in query(查询单词权重)
  • Wt,d = weight for term in document(文档单词权重)
  • Product = Wt,q * Wt,d
  • Score = Sum of the products(结果的总和)

正在排名的主页: www.fietsentoko.nl/

term Query - - - Document - - Product
- tf df idf Wt,q tf Wf Wt,d
Fiets 1 25.500.000 3.610493159 3.610493159 21 441 0.70711 2.55302
Kopen 1 118.000.000 2.945151332 2.9452 21 441 0.70711 2.08258
- - - - - - - Score: 4.6356

我想要去取得排名的页面:www.fietsentoko.nl/fietsen/

term Query - - - Document - - Product
- tf df idf Wt,q tf Wf Wt,d
Fiets 1 25.500.000 3.610493159 3.610493159 22 484 0.61782 2.23063
Kopen 1 118.000.000 2.945151332 2.945151332 28 784 0.78631 2.31584
- - - - - - - Score: 4.54647

几天过去,Google爬取到了这个页面,我修改的文档开始为这一单词排名。咱们能够得出结论,你使用单词的次数不必定重要,找到你想要排名的单词合适的平衡点很是重要。

Speed up the process 加速过程

为了找到查询条件的文档,为此每一个文档都得执行这样的计算,须要花费大量的处理能力。你能够经过增长一些静态值来肯定为哪些是你要计算得分的文档解决这个问题。好比PageRank就是一个好的静态值。当你首次给那些匹配查询条件而且有很高的PageRank计算得分时,你会发现一些改变,一些文档不管如何都能出如今结果的前10个。

另一个可能性是优胜列表的使用。对于每一个单词,只去取含有该词的前N个文档。若是你有多项查询,则能够将这些列表交叉以查找包含全部查询字词的文档,而且可能会有一个高分。只有包含全部词的文档过少,你才能在全部文档中搜索。所以,你并不仅是找到最佳的矢量得分来排名,也能够经过获取正确的静态分数。

Relevance feedback 相关性反馈

基于文档的相关性,相关性反馈为查询中的单词分配更多或更少的值。经过使用相关性反馈过程,搜索引擎能够自行改变其搜索而不用通知用户。

这里第一步要作的就是断定一个文档是否(与查询)相关。虽然如今有搜索引擎能够指定一个结果或者文档是否相关,可是Google很长时间并未曾拥有这样的功能。他们的第一次尝试是为搜索结果添加一个最喜欢的星标。如今他们正使用Google+按钮进行尝试。若是有足够多的人开始为一个肯定的结果点击按钮,Google便会开始考虑将这个文档与该查询关联起来。

另外一个方法查看排名很好的当前页面。这些页面也会被考虑是相关的。该方法的风险在于主题的缥缈。若是你正在查找奶油肉丸(bitterballen)和可乐饼(croquettes),那么排名最高的页面就是阿姆斯特丹的小吃店,风险就是你会给阿姆斯特丹分配一个值,那么最终结果中只会有阿姆斯特丹的小吃店。

Google的另外一种方法是简单使用数据挖掘。他们还能够查看不一样页面的点击率。对于平均值,有较高的点击率而且较低的跳出率的网页,也能够认为是相关的。跳出率页面很是高的将会是不相关的。

咱们使用此数据来调整查询项权重的示例是Rochio的反馈公式。归结起来为给查询中的词调整其值,而且可能增长额外的查询词。公式以下:

formula.png

下面这个表格是该公式的一个直观表示。假设咱们带入下面的值:
Query terms(查询词): +1 (alpha)
Relevant terms(相关词): +1 (beta)
Irrelevant terms(非相关词): -0.5 (gamma)

咱们有下面的查询:
“croquets and bitterballen”

如下文档的相关性以下:
Doc1 : 相关
Doc2 : 相关
Doc3 : 不相关

Terms Q Doc1 Doc2 Doc3 Weight new query
croquets 1 1 1 0 1 + 1 – 0 = 2
and 1 1 0 1 1 + 0.5 – 0.5 = 1
bitterballen 1 0 0 0 1 + 0 - 0 = 1
café 0 0 1 0 0 + 0.5 – 0 = 0.5
Amsterdam 0 0 0 1 0 + 0 – 0.5 = -0.5 = 0

新的查询以下:
croquets(2) and(1) bitterballen(1) cafe(0.5)

每一个词的值即是在查询中得到的权重值。咱们能够在矢量计算中使用这些权重。虽然单词Amsterdam给了一个-0.5的得分,将负值调整回0。这种方法,这样咱们就不会在搜素结果中排除单词。虽然café并无出如今本来的查询中,但它被添加进了查询并在新查询中给了其一个权重值。

假如Google用了这种相关性反馈的方式,那么你即可查看那些针对特定查询排名的网页。经过使用相同的词汇表,你能够确保从这种相关性反馈中获取最大收益。

小贴士

简而言之,咱们已经考虑了给一个基于网页内容的文档分配权值的之一选项。虽然矢量方法至关准确,但它确定不是计算相关性的惟一方法。对于模型会有不少的调整,然而它仍然只Google等搜索引擎完整算法的一部分。咱们也研究了相关性反馈。但愿 对于搜索引擎使用可使用外部因素的方法,我已经给你了一些看法。如今该是你对此探讨并研究一下那个excel文件的时间了:-)