Clucene實現中文分詞搜尋

2021-07-24 14:29:22 字數 1655 閱讀 4965

標籤: lucene

token

null

delete

character

windows

2012-08-29 11:43

522人閱讀收藏

舉報

搜尋引擎(5)

最近,一陣忙乎,終於在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函式。^_^

0

踩 0

Clucene實現中文分詞搜尋

最近,一陣忙乎,終於在clucene 版本0.9.16 中實現了中文分詞搜尋。一些需要改動的地方如下 一 把專案設定為use unicode character set。因為使用ansi時,漢字存在與其他語言編碼重疊的問題,不能準確判斷是否為漢字。二 src clucene util misc.cp...

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 影視 心上人啊快給我力量...