Blankego's Humble Home
Tags: ids ime

利用IDS數據庫自動生成形碼輸入法碼表

專案地址: https://bitbucket.org/need4steed/ids_db

Q:甚麼是IDS?

A:IDS 是 ideographic description sequence (表義文字描述序列)的縮寫,簡言之就是漢字合體字的構字式。詳細說明請參閱此帖和該帖起頭所提供的一串鏈接。

編製字根式的形碼,究其本質:一是建立一個能夠覆蓋整個字集的字根(主觀選定的部件(components)或部件組合)碼表(元件映射表);二是設定一套從每個漢字的完整字根碼序列中抽取字碼的規則(取碼規則)。

Q:甚麼是完整的字根碼序列?

A:以「礴」字為例。其五筆98的字根序列為石 艹 氵 甫 寸,「石」的字根碼為「大」(D),艹的字根碼為「工」(A),依此類推,那麼其完整的字根碼序列就是大工水木土(DAISF)

五筆的由字根碼序列抽取字碼的規則極簡單,若不考慮補碼(末筆識別碼),就是取字根碼序列的1、2、3,末碼,不足四碼的按順序全取。那麼,「礴」字的字碼就是「大工水土」->DAIF。

字根碼序列是由字根序列和字根碼表推導出來的。而字根序列又可通過翻譯構字式(IDS)而得出。如「礴」字的構字式,最簡式為:「H石薄」,最詳式為 「H石Z艹H氵Z甫寸」,將結構符去掉(flatten),得出的就是同五筆一模一樣的的字根序列。

經過以上的分析,順理成章地我們都會提出這樣一個設想:

Q:能不能利用現成的構字式數據自動生成形碼輸入法的編碼呢?

A:答案當然是肯定的。

筆者業已成功地實踐了這個設想,不然也不會發這個主題

我比較欣賞鄭碼所選定的大字根集和它的準全息式的字根編碼,然而極不贊成它的首、二、次末、末式的取碼規則。想微調一下它的字根集,增加若干字根和改動部分字根編碼,對它的取碼規則要進行大修,以使得它的拆字更貼近直觀,並在一定程度上降低其重碼率。

對7萬多個漢字逐字編碼是極其痛苦的。俺是個懶人,因為懶,要麼甚麼都不幹,真要幹點甚麼,也不會head first,一頭扎進去,硬幹到底,而首先想的是有沒有捷徑可走,怎麼幹纔最省力。因此俺就打上了IDS的主意。皇天不負懶人心,鼔搗了幾天,總算是鼔搗出來了。

做這個專案最大的難關是摸索這個新的取碼規則,而實現由IDS到字根序列的翻譯倒是很容易的。 大致的步驟:

  1. 從合體字集(compounds)中抽取出全部字元(elements),即所謂最大公約數 --現有的IDS 58000字集中字元為850多個
  2. 將字元全部編碼,可拆解的給出字根碼序列。
  3. 把字元集之外的字根匯入,也給出編碼(如鄭碼的「廣、髟、骨」五筆的「早、古」等)--滙合成的碼表稱為roots.csv
  4. 建立由字元碼集和構字式生成字元碼序列的腳本
  5. 抽取字碼、簡碼,生成詞碼,blahblah,一堆零碎的工作
  6. 成生輸入法碼表。

roots中的的root享有比構字式中一般部件更高的優先級,如「髮」字,構字式為Z髟犮,髟可以進而拆成H镸彡,然而「镸彡」的編碼跟髟的不同,所以不能拆開。構字式在遞歸析構(deconstruction)的過程中,通到這類roots就真接置換成相應的編碼。

再有,如「衡衕」一類的字,構字式為W彳〇亍;「這建」一類的字,構字式為L辶言 L廴聿等 --對這類字,若輸入法的取碼規則與構字式不同,則應在翻譯的時候按輸入法的規則調整過來。

(暫定名夷微碼,典出《老子》)新規則和字根因屬於實驗性質先按下不表,這裡先列出一些初步的統計數據,與諸君分享一下DIY的快感

已編碼漢字凡58450字,包含GB2312的全部、big5的全部、CJK unified ideograph的全部、CJK ext a的大部、ext b的一大半。

重碼
字集夷微原始鄭碼張碼五筆
GB2312188組270108(包括2簡?)254
常用6373個傳統漢字162組270149277
big5661組10106031054
blog comments powered by Disqus