用Ruby處理台灣語文:Formosa
在Ruby Forge上的Formosa是lib-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重寫這一部份程式碼的原因。
lukhnos :: Jul.30.2007 :: tekhnologia 技術或者藝術 :: 2 Comments »
2 Responses to “用Ruby處理台灣語文:Formosa”
”oe” 一字的調號應該標在 oe 上 → ”oe” 一字的調號應該標在 “e” 上
Kaihsu,
Thanks for the correction. :)