Hi! I’m clsung

Hi! I’m clsung

clsung’s blog site, or you can call me AlanSung

Hi! I’m clsung RSS Feed
 
 
 
 

快快樂樂學 Ruby - 再談 Ferret

這只是為了要呼應之前的舊文章

話說昨天早上到了實驗室,發現 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這篇論文

GENERIC_ANALYSIS_REGEX = /([a-zA-Z]|[xc0-xdf][x80-xbf])+|[0-9]+|[xe0-xef][x80-xbf][x80-xbf]|[xa1-xfe][x40-x7exa1-xfe]/

新加的部份是

[xa1-xfe][x40-x7exa1-xfe]

當然,要測試一下,在這之前我分開放了兩個文字檔,內容很簡單:

  • big5.txt

    中文
    大五碼中文
    Chinese

  • utf8.txt

    中文
    八萬碼中文
    Chinese

當然這樣看不出什麼端倪,用 vi 來看一下內文的編碼:

  • big5.txt

    xa4xa4xa4xe5
    xa4jxa4xadxbdXxa4xa4xa4xe5
    Chinese

  • utf8.txt

    xe4xb8xadxe6x96x87
    xe5x85xabxe8x90xacxe7xa2xbcxe4xb8xadxe6x96x87
    Chinese

這樣就很清楚啦。接下來是測試程式的片段:

GENERIC_ANALYSIS_REGEX = /([a-zA-Z]|[xc0-xdf][x80-xbf])+|[0-9]+|[xe0-xef][x80-xbf][x80-xbf]|[xa1-xfe][x40-x7exa1-xfe]/
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 上會有問題啊 :(

Technorati Tags: , ,

Share and Enjoy: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google
  • funp
  • Haohao
  • Hemidemi
  • Live
  • MisterWong
  • TwitThis
  • udn
  1. 我很想啦,老實說,動不動就給你一個亂碼實在是…[back]

3 Responses to “快快樂樂學 Ruby - 再談 Ferret”

  1. 1
    reality » Blog Archive » 全文搜尋 (Lucene 和 Ferret):

    [...] 快快樂樂學 Ruby - 再談 Ferret [...]

  2. 2
    本日書籤 05/23/2007 « penk - Keep on rockin’ in the free world:

    [...] http://blog.dragon2.net/2007/05/18/461.php [...]

  3. 3
    Multilingual Full Text Search on Ferret - Sprint:

    [...] 快快樂樂學 Ruby - 再談 Ferret [...]

Leave a Reply

噗浪:

分類

Flickr

    clsung. Get yours at bighugelabs.com/flickr
Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Taiwan
Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Taiwan