1. 程式人生 > >[置頂]搜尋引擎-一種提示詞推薦演算法

[置頂]搜尋引擎-一種提示詞推薦演算法

      搜尋引擎可以說目前所有網際網路應用裡技術含量最高的一種。儘管應用形式比較簡單:使用者輸入查詢詞,搜尋引擎返回搜尋結果。但是,搜尋引擎需要達到的目標:更全、更快、更準。如何讓搜尋結果更準確始終是搜尋引擎的一大難題。

  公司最近在開發某行業的垂直搜尋引擎,我作為該專案組的核心成員主要是負責核心演算法的研究工作。我也是剛開始接觸這個行業,目前還處於摸索階段,還有很長的路要走。

言歸正傳,先談一下這個專案的背景。這個專案是一個行業性質的垂直搜尋引擎。使用者分為兩大類:普通使用者、專業使用者。整個專案分為:爬蟲技術組,引擎組,大資料分析組和演算法組。引擎的爬蟲、詞庫的建立和引擎的選型都不是本文的重點,就一筆帶過,重點在於推薦演算法的設計。

一、網路爬蟲

  系統的資料,需要從幾個專業網站進行抓取。嘗試了幾個爬蟲,最後選取heritrix最為我們的爬蟲框架,選取它的原因主要是感覺配置項雖然多,但是比較靈活,特別適合我們的要求。當然,爬從技術組也自己嘗試實現了一個爬蟲,主要是爬取

地址比較固定幾種資料。

二、詞庫的建立

  詞庫初步分為專業主題詞、行業普通詞庫、一般通用詞庫、廢詞庫、還有用於感情分析的詞庫。

專業詞庫的實現前期是採取人工的方式來處理的,並製作了若干的輔助工具,供專業人員來挑選、合併、刪除主題詞的操作。

後面幾種詞庫的實現,是先選用了搜狗等幾種輸入法的詞庫庫為基礎,在這些詞庫的基礎上對爬蟲爬出來的文件進行向量化。

三、引擎的搭建

  通過對採集的資料進行去噪、分段、特徵提取,然後把相應的資料匯入到solr裡。

四、推薦演算法

  當用戶輸入關鍵詞查詢的時候,如何讓使用者查詢更準確呢?我們設想,針對使用者的輸入,我們如果能給出若干個和使用者輸入的關鍵詞相似度很近的詞,以這些作為查詢條件,如果我們的演算法足夠好,搜尋出來的結果會大大增加檢索的準確度。下面給出具體的演算法思路:

從向量化的角度來看,每一篇文件都對應一個向量,其中表示特徵項i.

是一個向量由詞、詞的位置、TF等義項來確定的。對於版本1,我們只取了詞、詞的位置。我們先用分類規則,把文件分成若干類,基於每一類進行如下計算:

表示兩個特徵項的相似度。

我們定義一下距離公式

 

我們對於每個文件的特徵項,兩兩求出特徵項的相似度。通過這個距離公式

我們可以得出,對於每一個分類,以這些特徵項為頂點,以相似度距離為邊,就構

成了如下的無向圖。

     (lawnet

  類比於wordnet和知網的hownet我們稱這個無向圖,為lawnet

  那我們的設想問題就轉化為:選取任意一個頂點,找出若干個(譬如10個)由這些頂點組成的最小生成樹或者邊權之和最小的最小子圖。這是一個區域性最優的隨機問題。也就是說,我們只需要滿足使用者認可的體驗程度即可,如果概率為90%,也就是說,當用戶輸入10000次,我們能成功給出9000次的提示詞就行了。

目前的解法我嘗試了兩種:

  一種PRIM演算法。

  第二種演算法:先通過floyd演算法,算出任意兩點的最短距離,作為一個邊;這些邊就組合成一個集合。然後給任意的頂點,從這個邊集合裡找出包含這個頂點的前N個最小邊。