原文地址:http://www.cnblogs.com/kekukele/p/4544349.html
前段時間,利用業余時間做了一個磁力搜索的網站Btdog,其中使用到了簡單的中文分詞與加權搜索,在這里分享給大家,供大家參考。
在我的網站中,中文分詞使用的是SCWS分詞系統,這個分詞系統提供PHP兩種使用方式:一種是你可以采用源碼安裝,具體安裝步驟請參考這里;
另外一種是使用其提供的API接口,具體方法參考這里。
下面,我們假設你已經掌握了SCWS的使用,事實上,其使用也非常簡單,若你不會其使用,也不影響本文下面的閱讀。
SCWS系統中其每個分好的詞包括以下屬性/鍵值:
在這里我們重點介紹下分詞屬性中的idf,這個是我們在我們的分詞算法中需要用到的。
IDF全稱inverse document frequency(逆向文檔頻率)是一個詞普遍重要性的度量,某一特定詞的IDF值,用總文件數除以包含該詞的文章數量,再將得到的商取對數(log)。計算公式:IDF = log(D/Dt),D為文章總數,Dt為該詞出現的文章數量。IDF的主要思想是:如果包含詞條t的文檔越少,也就是Dt越小,IDF越大,則說明詞條t具有很好的類別區分能力。
我們舉例說明下,如 搜索內容 ”復仇者的聯盟“,其SCWS的分詞結果如下:
可以看出,其分詞結果中,關鍵詞”復仇者“的idf為9.06,最具區分能力,而關鍵詞”的“的idf值為0,基本沒有區分能力,”聯盟“的idf為4.34也具有較強的區別能力。因此,我們在我們的分詞搜索中,可以簡單地使用idf值作為加權排序的依據。
在scws分詞系統中,其idf的取值為0-10,因此在我們下面給出的算法中,我們把內容全文匹配的權重設為10,即最大。其他分詞后關鍵詞的權重值設為其idf值,然后根據權重大小將結果逆序排列。這要我們就實現了簡單的中文分詞加權排序。核心代碼具體如下:
//@param:需要分詞的內容
//Return:mysql查詢條件字符串,加權排序字符串,關鍵詞
private function split_words($text){ $split_words = scws_new(); $split_words->set_charset('utf-8'); $split_words->set_ignore(true); $split_words->set_dict('/usr/local/scws/etc/dict.utf8.xdb'); $split_words->set_rule('/usr/local/scws/etc/rules.utf8.ini'); $split_words->send_text($text); $weight=10; $condition['where'] = "name LIKE '%".$text."%'"; $condition['order'] = "(CASE WHEN name LIKE '%".$text."%' THEN $weight ELSE 0 END)"; //設置全文匹配最大權重 while ($words_result = $split_words->get_result()) { foreach($words_result as $word_arr){ $condition['where'] .= " OR name LIKE '%".$word_arr['word']."%'";
//設置分詞后關鍵詞的權重為其idf的值
$condition['order'] .= " + (CASE WHEN name LIKE '%".$word_arr['word']."%' THEN ".$word_arr['idf']." ELSE 0 END)"; $condition['keywords'][$cnt++] = $word_arr['word']; } } $split_words->close(); return $condition; }
當然,更復雜的分詞還要考慮詞的詞頻TF,不過即使簡單的這樣,我們也基本能達到比較好的效果了,具體效果,大家可以到http://btdog.com.cn體驗下。
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答