coreseek是一個修改版的sphinx,用mmseg來做中文分詞。但是發現一個問題,日語搜索總是效果很差,全部是假名的關鍵詞會返回一個空結果。
開始猜想是不是詞庫沒有包含日語的關係,後來仔細想了一想,mmseg對於沒有在詞典里的詞應該是直接一元分詞的,按理說也不應該出現無法索引日語的關係。我們可以通過mmseg命令行工具來證明這一點:
1 2 |
$ /usr/local/mmseg/bin/mmseg -d /usr/local/mmseg/etc/ 1.txt ヨ/x ス/x ガ/x ノ/x ソ/x ラ/x |
證明mmseg進行了一元分詞。
那麼為什麼coreseek搜不到假名呢?我找啊找啊終於發現在coreseek使用mmseg進行分詞的過程中,對輸入字元做了一個過濾,並且有一個注釋:
1 2 3 4 5 |
// BEGIN CJK There is no case folding, should do this in remote tokenizer. // Here just make CJK Charactor will remain. --coreseek dRemaps.Add ( CSphRemapRange ( 0x4e00, 0x9FFF, 0x4e00 ) ); dRemaps.Add ( CSphRemapRange ( 0xFF00, 0xFFFF, 0xFF00 ) ); dRemaps.Add ( CSphRemapRange ( 0x3040, 0x303F, 0x3040 ) ); |
可見coreseek雖然將CJK (Chinese, Japanese, Korean) 中所有漢字、全形字元和標點加入了範圍,但是卻漏掉了平假名和片假名。因此我們將第三個range改成0x3000, 0x30FF, 0x3000就可以修正這個問題。
其中:
1 2 3 4 |
// 4e00 - 9fff CJK unified ideographs // 3000 - 303f CJK symbols and punctuation // 3040 - 30ff Hiragana/Katagana // ff00 - ffff half/fullwidth forms |
我把修改後的版本放到了github
另外,這裡可以查詢到Unicode編碼範圍對應的字元內容;unicode.org有一個database,但是是一個列出了全部字元的大pdf,我似乎沒有找到類似的分類。
對於Ubuntu/Debian,這裡有編譯好的coreseek的deb包:i386 amd64;依賴於mmseg:i386 amd64;mmseg自帶的詞典
對於>2.2.10的版本,我在這篇博客里提供了完整的補丁,可以應用在sphinx的源碼上編譯。
coreseek這個項目自從去年6月未見進展, 要是有人能將其升級至最新的sphinx 2.2.10 功德無量
現在github上的就是2.2.10了啊
額,沒找到文件。。。
window的要改該怎麼改?
我已經發pr給原作者,現在可以直接下載分支編譯https://github.com/nzinfo/csft/tree/t/seg
具體該怎麼做,我不是很明白
點https://github.com/nzinfo/csft/archive/t/seg.zip下載壓縮包然後打開解決方案編譯。 不過我沒試過windows能不能編譯出來
我試試
要不你直接幫我編譯一下日文的詞庫,我txt的詞庫給你,你直接給我一個lib的文件唄
這個和詞庫沒關係,只是把假名加到了索引的字元範圍里,之前程序會把假名當做符號忽略掉。詞庫的問題你自己生成一下嘛,沒詞庫就是一元分詞