這只是為了要呼應之前的舊文章…
話說昨天早上到了實驗室,發現 b6s 前一晚留給我有關 Ferret 的訊息。兩點,第一是 lukhnos實作了 Ferret 處理中文的方法,在這裡。當然,處理中文很重要,但並不是我棄 Ferret 保 PyLucene 的原因。而 b6s 留的另一個訊息是 Ferret 處理原生 Lucene 的 cfs 索引檔有解(或是將要有解)。這就有點意思了,因為我們實驗室的 index 如果不能用 Ferret 讀,那其實有點英雄無用武之地的感覺。
但是最後讓我再來試 Ferret 的原因,卻還是第一個:中文。
原先 lukhnos 的文章中的 regex 可以適當地處理 ASCII、歐語以及 CJK(UTF-8 碼)字元,雖然我不確定有沒有包含越南(CJKV?)不過 UTF-8 碼的 regex 就在這裡了,要自己改也是沒什麼問題。那對於 Big5 碼呢?其實現在的時代,用 Big5 碼的人逐步減少了,不過還是在國內佔大宗吧?像聯合新聞網、中時電子報還有自由電子報都還在使用 Big5 。雖然我們 *現在* 使用的軟體大多在處理這些語料時會先轉為 UTF-8 再分析,但也不能就此就把 Big5 丟到一邊去(1)。
所以我改了 lukhnos 的 GENERIC_ANALYSIS_REGEX ,加上 Big5 的部份,有關 code range 可以參考 O’Reilly 的這篇論文:
新加的部份是
當然,要測試一下,在這之前我分開放了兩個文字檔,內容很簡單:
- big5.txt
中文
大五碼中文
Chinese - utf8.txt
中文
八萬碼中文
Chinese
當然這樣看不出什麼端倪,用 vi 來看一下內文的編碼:
- big5.txt
xa4xa4xa4xe5
xa4jxa4xadxbdXxa4xa4xa4xe5
Chinese - utf8.txt
xe4xb8xadxe6x96x87
xe5x85xabxe8x90xacxe7xa2xbcxe4xb8xadxe6x96x87
Chinese
這樣就很清楚啦。接下來是測試程式的片段:
GENERIC_ANALYZER = Analysis::RegExpAnalyzer.new(GENERIC_ANALYSIS_REGEX, true)
index = Index::Index.new()
index2 = Index::Index.new(:analyzer => GENERIC_ANALYZER)
…
chinese_u = "中文"
conv = Iconv.new(‘big5′,‘utf-8′)
chinese_b = conv.iconv(chinese_u)
puts "Search ‘Chinese’…"
index.search_each("Chinese") do |doc, score|
puts index[doc][‘file’]
end
puts "Search utf8 word of ‘Chinese’…"
index.search_each(chinese_u) do |doc, score|
puts index[doc][‘file’]
end
puts "Search big5 word of ‘Chinese’…"
index.search_each(chinese_b) do |doc, score|
puts index[doc][‘file’]
end
上面的 search code 並沒有 index2,這是因為兩段碼是相同的,就沒有加上去了。至於寫的美不美觀,我只是個初學者,第二支 ruby 程式也不要太要求,我連 loop statement 都不太會咧。
執行結果:
Search ‘Chinese’…
./text/big5.txt
./text/utf8.txt
Search utf8 word of ‘Chinese’…
Search big5 word of ‘Chinese’…
Indexer with GENERIC_ANALYZER
Search ‘Chinese’…
./text/big5.txt
./text/utf8.txt
Search utf8 word of ‘Chinese’…
./text/utf8.txt
Search big5 word of ‘Chinese’…
./text/big5.txt
可以看得出來,沒有用 GENERIC_ANALYZER 的 index ,無法搜尋中文字串,而有用 GENERIC_ANALYZER 的 index2 ,結果也符合預期。
結論是我可以再來玩玩 ruby 了。雖然暫時還不會去處理實驗室既有的語料庫,不過自己實驗用的倒可以考慮一下。沒有用 PyLucene 的原因是因為在 gcj 在 FreeBSD amd64 上會有問題啊
[tags] ruby, lucene, ferret [/tags]
- 我很想啦,老實說,動不動就給你一個亂碼實在是…[back]
[...] 快快樂樂學 Ruby – 再談 Ferret [...]
[...] http://blog.dragon2.net/2007/05/18/461.php [...]
[...] 快快樂樂學 Ruby – 再談 Ferret [...]