最近,一陣忙乎,終於在clucene(版本0.9.16)中實現了中文分詞搜尋。
一些需要改動的地方如下:
一、 把專案設定為use unicode character set。因為使用ansi時,漢字存在與其他語言編碼重疊的問題,不能準確判斷是否為漢字。
二、 \src\clucene\util\misc.cpp中有個misc::_cpychartowide函式,這個函式是clucene中用來將char 字串轉換為wchar_t字串的,但原**中使用的是不考慮編碼的轉換,把漢字從ansi編碼轉到ucs2編碼會失效,所以需要在\src\ clucene\stdheader.h的巨集定義中,改用windows api的multibytetowidechar函式。
line350 改為#define strcpy_atow(target,src,len) multibytetowidechar(936,0,src,-1,target,len);
\src\clucene\util\misc.cpp,line67的misc::_chartowide函式呼叫了_cpychartowide函式,需修改。
三、 要實現中文按詞搜尋必須按中文語法實現analyzer介面。clucene裡面有乙個standardanalyzer類,它本意是可以處理亞洲語言 (包括中日韓),但不完善。可以通過改寫 \src\clucene\analysis\standard\standardtokenizer.cpp檔案來達到目的。
其中,有乙個standardtokenizer::next(),用來獲取下乙個token。token可以簡單看成是索引檔案中的乙個項。在原** 中,先判斷是否為alpha,再判斷是否為_cjk,而在中文windows系統上,將乙個ucs2編碼的漢字(正好乙個wchar_t)作為引數傳給 iswalpha函式時,返回值是true。所以任何cjk字元都會被處理成alpha。因此,專案修改為使用unicode編碼後,readcjk函式 不會被呼叫到。所以需要將原**中的if(_cjk)的判斷分支放到if(alpha)前面,這樣遇到cjk字元時就會呼叫 standardtokenizer::readcjk。
readcjk函式用於讀取乙個cjk的token。這個函式不能處理中文分詞,它遇到cjk字元時一直向後讀取,直到遇到非cjk字元或檔案結束才跳出,把讀取到的整個字串作為索引中的乙個項。所以需要重寫這個函式。
我在standardanalyzer類加入了乙個公有類paticiple,這個paticiple類有乙個方法 paragraphprocessing(char *str,char *result),可以用來把乙個char型別的中文字串str進行分詞,由result返回分詞結果,詞與詞之間用空格格開。以下是我重寫的 readcjk函式:
五、輸入的查詢語句在轉化為query物件時必須以標點符號結束,否則會被處理為乙個不完整句子,最後的幾個字元不能寫入索引項。
ps:為了能顯示wchar_t型別的字串,還必須使用wcout函式代替 printf函式。^_^
Clucene實現中文分詞搜尋
標籤 lucene token null delete character windows 2012 08 29 11 43 522人閱讀收藏 舉報 搜尋引擎 5 最近,一陣忙乎,終於在clucene 版本0.9.16 中實現了中文分詞搜尋。一些需要改動的地方如下 一 把專案設定為use unico...
mysql 中文分詞搜尋 php中文分詞搜尋
本篇文章主要介紹php中文分詞搜尋,感興趣的朋友參考下,希望對大家有所幫助。2 php.ini 中配置 extension php scws.dll scws.default.charset utf8 配置預設的編碼方式 scws.default.fpath e wamp scws 加壓後檔案的路徑...
Spark Jieba實現中文分詞
本案例使用jieba分詞,jieba 是目前最好的 python 中文分詞元件,使用spark同樣也能實現中文分詞。實現步驟如下 com.huaban jieba analysis 1.0.2 8920397333 王錚亮 時間都去哪了 私人訂製 插曲 8920422333 影視 心上人啊快給我力量...