渣翻:搜索引擎算法基礎

這是我參與更文挑戰的第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文件的時間了:-)

相關文章
相關標籤/搜索