woff 發表於 2012-12-14 17:31:31

php 中文分詞和模糊搜尋 關鍵字

在java中做全文搜索的話可以使用Lucene以及中文分詞插件。在php中做全文搜素引擎可以使用Sphinx,中文分詞也有很多選擇,使用scws是不錯的選擇。scws的全稱是Simple Chinese Words Segmentation。使用scws有三種方式:一種是使用C語言編寫的scws並在源碼基礎上進行拓展,速度最快但是不易拓展;一種是安裝scws針對php編寫的插件,然後就可以直接在php中調用的scws的api函數,本文介紹的就是這種方法;最後一種是使用php重寫的scws函數庫,優點是不需要安裝額外的插件,缺點是程序的運行效率很低。(具體信息參見http://www.ftphp.com/scws)
在php中安裝完scws插件後,執行如下語句:
$str = "在數據庫中儲存層次數據";
$temp = array();
$cws = scws_new();
$cws->set_multi(1);
$cws->set_charset('utf8');
$cws->send_text($str);
while ($tmp = $cws->get_result())
{
        $temp[] = $tmp;
}
$arrWhere = array();
$t = array();
foreach($temp as $key=>$value){
        foreach($value as $item){
                $t[] = $item['word'];
        }
}
pirnt_r($t)
程序運行後輸出:


Array
(

=> 在
=> 數據庫
=> 數據
=> 中
=> 儲存
=> 層次
=> 數據
)




可以看到分詞結果中有重疊的地方,通過調節$cws->set_multi(1);中參數的值可以調整分詞結果的顆粒度。例如設置$cws->set_multi(2);後輸出結果為:


Array
(

=> 在
=> 數據庫
=> 數據
=> 據庫
=> 中
=> 儲存
=> 層次
=> 數據
)


使用這個中文分詞插件可以做一些應用,比如交友網站上允許用戶輸入模糊搜索信息,用戶可以輸入「浙江杭州22歲有圖」來搜索用戶,經過分詞輸出數組:


Array
(

=> 浙江
=> 杭州
=> 22
=> 歲
=> 有
=> 圖
)


再在經過一些語義分析後(進行這種限定較多的語義分析並不複雜),就可以得到對應的數據庫查詢條件:
select * from members where str_provicne="浙江" and str_city="杭州" and int_age=22 and has_pic=1

頁: [1]
查看完整版本: php 中文分詞和模糊搜尋 關鍵字