The Old Blog Archive (Traditional Chinese), 2004-2009

用Ruby處理台灣語文:Formosa

在Ruby Forge上的Formosalib-formosa的延伸計劃。我們希望能使用Ruby,讓處理台灣語文更為容易,Formosa就是這樣一套gem library。

目前Formosa跟lib-formosa一樣,僅處理了台灣閩南語(Holo; Southern Min)的音節。未來希望能擴展到客語(Hakka)及其他台灣語言。

安裝Formosa的方法很簡單(前面依權限不同,可能需要加上 sudo):

gem install formosa

然後就可以在Ruby程式中使用了:

$KCODE = "u"
require "rubygems"
require "active_support"
require "formosa"
include Formosa::Holo
poj = SyllableType::POJ
tl = SyllableType::TL

# 將ASCII形式的POJ的音節,轉換成TL,下例輸入 goa2,輸出 guá
SyllableUtility.compose_syllable(poj, tl, "goa2")

下例將Wikipedia閩南語版的頭一句話,轉成ASCII形式:

SyllableUtility.convert_text_into_query_form(0, "Hoan-gêng lâi Wikipedia ê Holopedia hōng-tê!")

輸出即為 “Hoan-geng5 lai5 Wikipedia e5 Holopedia hong7-te5!”

如果把上述query form再倒進去compose_syllable中,就可以得到,例如說,台羅版的歡迎詞 “Huan-gîng lâi Wikipedia ê Holopedia hōng-tê!”:

SyllableUtility.compose_syllable(poj, tl, "Hoan-geng5 lai5 Wikipedia e5 Holopedia hong7-te5!")

formosa這個gem裡面事實上包含了一份C++版本的lib-formosa,以native extension形式存在。之所以這樣設計,主要是考量目前對於ASCII form to composed form(或者是正規化後的normalized/canonical form),還是以C++版本寫得最為完整。

不過,Ruby版本的formosa,還能夠將composed form轉換為ASCII form (query form),對於已經寫上標音號的文本(例如紅皮聖經、Wikipedia,或上述例子)的再處理上,應該有相當大的幫助。

名詞解釋

上述用了一些我們在發展OVIMPOJ(OpenVanilla的POJ輸入法)以及lib-formosa時所創的名詞,也許並非台語文資訊處理的正式用法。如果有疑義的地方還請大家指正:

  • Query form (ASCII form): 未加標音號、結尾為數字、以ASCII形式表現的台語文音節。例如goa2 (我), tai5-uan5 (台灣) 等等。Query form也是用在輸入法資料表格的形式,因此稱為query form。由於query form只允許將調號放在音節後,因此也同時隱含了音節恆為正規化形式(normalized)的假定。
  • Composed form: 加了標音號(diacritic; tone mark)後的形式。例如goá, tâi-uân等等。Composed form有幾個麻煩的地方:(1) Unicode的問題,此問題已有許多人探討過,在此不表、(2) 正確的調號標示位置。例如早期「白話字」(pe̍h-ōe-jī)一詞,「白」的七聲號是標在母音 “o” 上面,然而近年來隨著音響律(sonority rules)共識形成,”oe” 一字的調號應該標在 e 上(oē,寫成台羅為uē),(3) 是否應容許「錯誤」的寫法(例如撰寫語言教科書,或探討歷史文獻時,諸如上述ōe/oē的例子)。
  • Normalized form: 即經過了正規化(normalization),調號擺放回正確位置的形式。我們內部文件裡偶爾會有normalized composed form或canonical form這種寫法。另外如前所述,query form永遠是normalized,因此就沒有normalized query form這種說法了。

在C++版本的lib-formosa中,HoloVowel跟HoloSyllable是兩個不同的單位。在內部表示(internal representation)上,我們允許各種音節形式(例如 “áéééì” 也是可被接受的);我們用各種輸出函數來得到最後的形式(query form, composed form in POJ/TL)。這一個設計上的複雜度也是我們暫不考慮改用Ruby重寫這一部份程式碼的原因。

2 Responses to “用Ruby處理台灣語文:Formosa”

  1. on 31 Jul 2007 at 16:53Dr Kaihsu Tai

    ”oe” 一字的調號應該標在 oe 上 → ”oe” 一字的調號應該標在 “e” 上

  2. on 31 Jul 2007 at 16:56lukhnos

    Kaihsu,

    Thanks for the correction. :)