搜索引擎可以說目前所有互聯網應用里技術含量最高的一種。盡管應用形式比較簡單:用戶輸入查詢詞,搜索引擎返回搜索結果。但是,搜索引擎需要達到的目標:更全、更快、更准。如何讓搜索結果更准確始終是搜索引擎的一大難題。
公司最近在開發某行業的垂直搜索引擎,我作為該項目組的核心成員主要是負責核心算法的研究工作。我也是剛開始接觸這個行業,目前還處於摸索階段,還有很長的路要走。
言歸正傳,先談一下這個項目的背景。這個項目是一個行業性質的垂直搜索引擎。用戶分為兩大類:普通用戶、專業用戶。整個項目分為:爬蟲技術組,引擎組,大數據分析組和算法組。引擎的爬蟲、詞庫的建立和引擎的選型都不是本文的重點,就一筆帶過,重點在於推薦算法的設計。
一、網絡爬蟲
系統的數據,需要從幾個專業網站進行抓取。嘗試了幾個爬蟲,最后選取heritrix最為我們的爬蟲框架,選取它的原因主要是感覺配置項雖然多,但是比較靈活,特別適合我們的要求。當然,爬從技術組也自己嘗試實現了一個爬蟲,主要是爬取地址比較固定幾種數據。
二、詞庫的建立
詞庫初步分為專業主題詞、行業普通詞庫、一般通用詞庫、廢詞庫、還有用於感情分析的詞庫。
專業詞庫的實現前期是采取人工的方式來處理的,並制作了若干的輔助工具,供專業人員來挑選、合並、刪除主題詞的操作。
后面幾種詞庫的實現,是先選用了搜狗等幾種輸入法的詞庫庫為基礎,在這些詞庫的基礎上對爬蟲爬出來的文檔進行向量化。
三、引擎的搭建
通過對采集的數據進行去噪、分段、特征提取,然后把相應的數據導入到solr里。
四、推薦算法
當用戶輸入關鍵詞查詢的時候,如何讓用戶查詢更准確呢?我們設想,針對用戶的輸入,我們如果能給出若干個和用戶輸入的關鍵詞相似度很近的詞,以這些作為查詢條件,如果我們的算法足夠好,搜索出來的結果會大大增加檢索的准確度。下面給出具體的算法思路:
從向量化的角度來看,每一篇文檔都對應一個向量,其中
表示特征項i.
是一個向量由詞、詞的位置、TF等義項來確定的。對於版本1,我們只取了詞、詞的位置。我們先用分類規則,把文檔分成若干類,基於每一類進行如下計算:
表示兩個特征項的相似度。
我們定義一下距離公式
我們對於每個文檔的特征項,兩兩求出特征項的相似度。通過這個距離公式
我們可以得出,對於每一個分類,以這些特征項為頂點,以相似度距離為邊,就構
成了如下的無向圖。
(lawnet)
類比於wordnet和知網的hownet,我們稱這個無向圖,為lawnet。
那我們的設想問題就轉化為:選取任意一個頂點,找出若干個(譬如10個)由這些頂點組成的最小生成樹或者邊權之和最小的最小子圖。這是一個局部最優的隨機問題。也就是說,我們只需要滿足用戶認可的體驗程度即可,如果概率為90%,也就是說,當用戶輸入10000次,我們能成功給出9000次的提示詞就行了。
目前的解法我嘗試了兩種:
一種PRIM算法。
第二種算法:先通過floyd算法,算出任意兩點的最短距離,作為一個邊;這些邊就組合成一個集合。然后給任意的頂點,從這個邊集合里找出包含這個頂點的前N個最小邊。