Posts RSS Comments RSS  

Archive for July, 2007

用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重寫這一部份程式碼的原因。

Ruby Tuesday: RSpec; 7/31在OPCafé

兩週一次的Ruby Tuesday,本週二(7/31)如常在新竹的OPCafé舉行。iHower將繼續為我們帶來Ruby/Rails testing所需要的各種知識與工具。本週承繼上週的主題,並將介紹RSpec這個工具。歡迎大家參加。:)

並非「藝術是長的」

相當喜歡的一句名言是Seneca的”ars longa, vita brevis”。雖然很多人以其直譯”art is long, life is short”來謂藝術的生命長於人壽。但事實上追其語源,是Hippocrates對醫者的忠告:”ho bios brakhys, hê de tekhnê makrê” (ὁ βίος βραχύς, ἡ δὲ τέχνη μακρή)。

事實上,原文的 tekhnê (τέχνη,也就是 TeX 的語源啦)指的是「醫學的技術」。所以此處Hippocrates並非在感時傷懷,而是在告誡,技術的學習是無止盡的,而從業的困難重重(Wikipedia上的文章列舉了這些困難)。

多年前一位才氣極高的朋友(此人後來有拿到台灣重要的文學獎)曾說,”ars longa vita brevis” 最適切的翻譯莫過,「生也有涯,知也無涯」。不過如果窮盡Hippocrates的原文精神,則此種翻法恐怕也不妥。畢竟那後面可還有一句「以有涯隨無涯,殆已」。這兩者的精神,恐怕就差很多了吧。

因見到這篇日人文章提及此事,記之。另外也因此學到了原來 “crisis” (κρίσις, krisis) 的原意是「決定、決斷、判斷」。

牛仔褲、選擇、wardrobe update

I said, I want the kind that used to be the only kind. He [the store assitant] had no idea what that was. So I spent an hour trying on all these damned jeans. And I walked out of the store, truth, with the best fitting jeans I had ever had. I did better. All these choices made it possible for me to do better. But, I felt worse.

–Barry Schwartz, “The Paradox of Choice“. TED talk, 2005.

這半年來我一直為尋找新衣新鞋所苦。很久沒逛街的我突然發現,過去喜歡的鞋型一瞬間從市場消失。板鞋和帆布鞋佔滿架位,連籃球鞋也remix了1970年代的款式。連帶而來的是過去穿了很久的某款牛仔褲(”the only kind” that I wore)也不合時宜起來。最近終於漸漸脫離這種困境,不過卻總讓我想起Barry Schwartz的TED talk。困擾我的倒不是選擇過多的難,而是「與時俱進」這件事情的不容易,特別是在穿著這種進步緩慢,但只要一段時間不更新,就能感受到明顯差距的東西。

But yea, I now feel better.

寫程式與傳統神祇

可能因為最近聽《倒退嚕》聽得有點多,讓我想到一個問題。很多傳統行業都要拜同樣傳統的神祇,像是關公或媽祖。那麼,寫程式這一行,應該拜誰呢?

想來想去,好像是三太子最合適?嗯,Hacker嘛。

星星是C喔
$$是Perl
天狗喫Java
老鼠是Ruby
白白是Python

(cf. 「尖嘴是雞喔 扁嘴是番鴨 翹翹是豬肉 四角是豆干 白白是麵線」)

7/17 Ruby Tuesday的投影片和錄音檔(更正URL)

感謝 iHower 為大家帶來精采的 “Rails Testing”,而且據稱這只是上集,且待兩週後的下回分曉!也謝謝大家熱情參與。:)

iHower的投影片可以在此處下載(轉自iHower’s blog)。現場錄音則可從此處下載 (43′ 55″)。

下一回Ruby Tuesday,iHower將繼續主講Rails testing、BDDRSpec。7/31晚上八點在OPCafé見!

Quote of the Day (and All Times)

Simplicity, simplicity, simplicity! I say, let your affairs be as two or three, and not a hundred or a thousand; instead of a million count half a dozen, and keep your accounts on your thumb-nail. In the midst of this chopping sea of civilized life, such are the clouds and storms and quicksands and thousand-and-one items to be allowed for, that a man has to live, if he would not founder and go to the bottom and not make his port at all, by dead reckoning, and he must be a great calculator indeed who succeeds. Simplify, simplify.

– Henry David Thoreau, Walden. Emphasis mine.

三部舊電腦出讓(8080, 6502, 68k機型各一)

Update: Mac Plus已經出讓。

最近在整理家裡。我們想出讓三台舊電腦,預計在一個月之內做完這件事。這三台機器分別是:

  • 一部應該是Vector Graphics於1970年代末期/1980年代初期製造的CP/M機器,型號為Vector 3。我們手上還有一整箱5.25吋軟體,據稱有中文系統。上一次開機應該是將近十年前的事了,狀況不明。
  • 「中華商場牌」的Apple II乙台(you know what that means),有各種台版電玩遊戲磁帶和磁碟片數盒。上一次開機也是將近十年前的事了。
  • 一台Mac Plus,1987年機種,我於1998年接手此機,擴充至4 MB RAM。有20 MB SCSI外接硬碟一台(5.25″,獨立供電),傳統鍵盤乙枚、滑鼠一隻。上一次開機是去年春天的事。螢幕要熱機數分鐘後才會顯示正常。

這三部機器都放在家中的客房裡,常年開除濕機,因此單純的保存狀況應該還ok。但前兩台機器由於久未開機,很難判斷狀況如何。

貼出讓公告的目的,是想看看有沒有朋友有興趣接手,不管是原箱接手再整理,還是打算等我這一個月之內測試開機後再接手都可以。簡單地說我對這三台機器沒有任何期望,如果一直沒有人有興趣,可能直接送去回收。

看看有沒有機會碰到有興趣的朋友了。您可以用以下地址和我聯絡:lukhnos {在} gmail {dot} com。

Ruby Tuesday: 7/17 (二) 在新竹 OPCafé 新址

這週二的 Ruby Tuesday 我們請到了iHower來為主講 Rails testing 。

時間是 7/17 星期二 20:00-22:00,地點在OPCafé 新址(新竹市光華街95巷3號,地圖)。

有興趣瞭解 Rails testing 的朋友請不要錯過。:)

台灣解嚴20年

小學的時候,報紙有好長一段時間,都還用「民x黨」這樣的稱呼。

我在想,如果台灣至今仍實施戒嚴,所有那些對媒體與思想的管制,會不會也延伸到Internet上。固然對歷史提出假設性的問題意義不大,但台灣的過去應該說明了不少事情。那些對思想的管制,以及,為了管制所加諸的對人的身體的傷害、制度與結構上的暴力,以及對那種制度性暴力的恐懼、擁有管制權力的人的腐敗等等──再加上,或許最令人不能忍受的,是那種為那管制和暴力所做的辯解。那些東西是確確實實會留下痕跡的。

新聞台播出了許多當時的新聞片段或運動人士自己留下影像記錄。今昔相較,有許多的不可思議,也有,我相信,許多當時就已被提出、而今日尚未能真的說已經克服的挑戰。或許那又得再用另一個二十年了。

Next »