【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
說起搜尋引擎,大家肯定都不陌生。至少對於我來說,每日百度的次數不下幾十次。在資訊的查詢和搜尋方面,百度幫了我很大的忙,當然這中間也有很多搜尋結果我也不是很滿意。那麼不知道大家有沒有興趣知道搜尋引擎是怎麼做出來的?其實說簡單也簡單,說複雜也複雜。
大家知道,網路搜尋結果都是按照網頁來進行尋找的。一般來說,如果網頁中包含了這個關鍵字,那麼這個網頁就是我們需要的。但是,事實上結果不都是這樣的。大家知道,互連網上的網頁非常多,想要在不到1秒鐘的時間內就尋找到自己需要到那個結果基本上來說是不可能的。別的不說,把這互連網上幾十億個網頁下載下來就不是一件容易的事情,更不要說後面的尋找和遍曆了。所以說,搜尋引擎所尋找的任何結果都是電腦預先處理的結果,有了這個基本概念之後後面的講解就比較容易了。
要做一個簡單的搜尋引擎其實不是件複雜的事情。關鍵步驟可以分成三個部分,即網頁的遍曆和下載、中文分詞和解析、查詢結果和排序。
(1) 網頁下載和遍曆
要有自己的搜尋引擎,要有自己的資料,這個資料就是網頁的數量。說到這裡,我們就不得不說網頁的一個重要特性,那就是超連結。有了超連結,我們就可以繼續爬行到別的網頁了。說到這裡,有幾個問題需要考慮,這個網頁該怎麼爬行,是首先按照寬度進行遍曆呢,還是按照廣度進行遍曆呢,如何判斷哪些網頁是已經遍曆過了的,哪些網頁尚沒有遍曆,如果利用多線程對網頁進行遍曆呢?
(2)中文分詞和倒排檔案
有了自己的網頁,這隻是一個基本條件。下面,我們就需要對網頁的資料進行拆解,對網頁中的每一個句子進行拆解。這就是所謂的中文分詞。當然,中文分詞可以有很多的方法,基本上說按照字典來拆解就可以了,要麼從左向右進行拆解,要麼從右向左進行拆解,或者按照最小片語數目進行拆解也可以。當然,網頁的數目是在不斷遞增的,但是一般來說一個語言的片語的數目是一定的,一般來說漢語的片語也就在幾十萬個左右。其他語言呢,比如說英語,因為英語是由一個一個單片語成的,按照牛津詞典的標準,單詞的最大數目也就在幾十萬個單詞上下。所以,在此我們設計了倒排檔案的格式。用最簡單的話說,我們不再關注一個網頁包含了哪些詞語,我們更關注某個詞語在哪些網頁中出現了,這就是倒排檔案的基本思路。
(3)索引尋找和排序
有了倒排檔案之後,我們就可以把這些索引結果用資料庫進行儲存起來的。因此,大家注意我們搜尋的任何結果都是從這份資料庫合并過來的。當然,查到了這些結果之後,我們怎麼判斷哪些排序結果應該排在前面,哪些結果應該排在後面。說到這裡,一個不得不提的演算法就是pagerank,這個演算法的基本思想就是大家都想要的結果就是你想要的結果,某個網頁重要是因為別人引用它的次數比較多。打個通俗的比方來說,一個被大家多次引用的論文品質肯定差不到哪去。當然,還有其他影響排序的因素,比如字頻、網頁日期、網站權重、是否為客戶購買的關鍵字、是否為作弊網頁、是否為標題文字等等。
選到這一個題目來寫我的部落格,和我的工作沒有什麼關係,主要是因為個人的興趣而已。當然,整個文章的風格和自己之前的部落格差不多,基本上還是一個標題一個標題來寫,中間會穿插C語言代碼描述該功能是怎麼實現的。要是還能對大家有一些協助,那是我最開心不過的事情了。