原文地址:http://www.cnblogs.com/kekukele/p/4544349.html
前段時(shí)間,利用業(yè)余時(shí)間做了一個磁力搜索的網(wǎng)站Btdog,其中使用到了簡單的中文分詞與加權(quán)搜索,在這里分享給大家,供大家參考。
在我的網(wǎng)站中,中文分詞使用的是SCWS分詞系統(tǒng),這個分詞系統(tǒng)提供PHP兩種使用方式:一種是你可以采用源碼安裝,具體安裝步驟請參考這里;
另外一種是使用其提供的API接口,具體方法參考這里。
下面,我們假設(shè)你已經(jīng)掌握了SCWS的使用,事實(shí)上,其使用也非常簡單,若你不會其使用,也不影響本文下面的閱讀?!?/p>
SCWS系統(tǒng)中其每個分好的詞包括以下屬性/鍵值:
在這里我們重點(diǎn)介紹下分詞屬性中的idf,這個是我們在我們的分詞算法中需要用到的。
IDF全稱inverse document frequency(逆向文檔頻率)是一個詞普遍重要性的度量,某一特定詞的IDF值,用總文件數(shù)除以包含該詞的文章數(shù)量,再將得到的商取對數(shù)(log)。計(jì)算公式:IDF = log(D/Dt),D為文章總數(shù),Dt為該詞出現(xiàn)的文章數(shù)量。IDF的主要思想是:如果包含詞條t的文檔越少,也就是Dt越小,IDF越大,則說明詞條t具有很好的類別區(qū)分能力。
我們舉例說明下,如 搜索內(nèi)容 ”復(fù)仇者的聯(lián)盟“,其SCWS的分詞結(jié)果如下:

可以看出,其分詞結(jié)果中,關(guān)鍵詞”復(fù)仇者“的idf為9.06,最具區(qū)分能力,而關(guān)鍵詞”的“的idf值為0,基本沒有區(qū)分能力,”聯(lián)盟“的idf為4.34也具有較強(qiáng)的區(qū)別能力。因此,我們在我們的分詞搜索中,可以簡單地使用idf值作為加權(quán)排序的依據(jù)。
在scws分詞系統(tǒng)中,其idf的取值為0-10,因此在我們下面給出的算法中,我們把內(nèi)容全文匹配的權(quán)重設(shè)為10,即最大。其他分詞后關(guān)鍵詞的權(quán)重值設(shè)為其idf值,然后根據(jù)權(quán)重大小將結(jié)果逆序排列。這要我們就實(shí)現(xiàn)了簡單的中文分詞加權(quán)排序。核心代碼具體如下:
//@param:需要分詞的內(nèi)容
//Return:mysql查詢條件字符串,加權(quán)排序字符串,關(guān)鍵詞
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)"; //設(shè)置全文匹配最大權(quán)重 while ($words_result = $split_words->get_result()) { foreach($words_result as $word_arr){ $condition['where'] .= " OR name LIKE '%".$word_arr['word']."%'";
//設(shè)置分詞后關(guān)鍵詞的權(quán)重為其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; }
當(dāng)然,更復(fù)雜的分詞還要考慮詞的詞頻TF,不過即使簡單的這樣,我們也基本能達(dá)到比較好的效果了,具體效果,大家可以到http://btdog.com.cn體驗(yàn)下。
PHP編程鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選