SGB
From Phonology
Contents |
Sinogram Graphemic Database
SGD——Sinogram Graphemic Database。
Graphemic 這個詞由詞幹graph-和後綴-eme構成(-ic 想來也用不著解釋)。Graph是gram的動詞形,表示書寫,可直譯作「書」;-eme表示元素,我還沒找到恰當的字眼來翻譯。很無奈的是字元這個詞已經被安上了不相干的意思,況且「字」的本義爲滋乳,用作文字的簡稱本來就不很貼切。沒辦法姑且用希臘文說事吧,至於字形、字型甚麼的,權作便利之變通。
對漢字的分析
漢字本身不能稱其爲科學,其創作意趣更近乎藝術,推演也不盡嚴密。但是這並不妨礙我們用科學的方法去分析她。所謂科學就必須以客觀實在爲根據與歸結。最簡單也是最可靠的研究方法就是對全部樣本——即對所有的字——逐個地,細緻地觀查,發現潛在的規律,整理成條文或者算式,然後再檢驗它是否可靠。而且,凡法則都有其成立的條件與適用的範圍。放之四海皆準的唯一真理事實上是不存在的,或者即使存在也與科學無關。
SGD 所分析對象準確地說是漢字的眞書。依筆劃種類及結構方式而論,手寫的楷書與剞劂所用到的宋體僅有風格上的差異並無體制上的不同,這裏所說的眞書也就是這兩類字體的概括。下文所說的漢字,不加特殊限定者,專指眞書。SGD將要成為一箇綜合性的數據庫,收蓄多種與字形關連的漢字屬性信息,然而題目是明確的, SGD的框架只有一箇,凡不在此框架之上的信息都不在SGD所劃定的範疇之内,也就是說它可以充當更複雜的中文文字學數據庫系統的一箇有機的組成部分。那麼,SGD的框架究竟是甚麼呢?連系上文所指出的漢字分析的原則,即客觀原則和相對原則,我們目前在此原則之上對漢字的認識角度和程度處於如下狀態:
一,筆劃
所有的漢字都由筆劃構成,書寫漢字所用到的全部筆劃可歸結爲數十類。筆劃是高度抽象的概念,筆劃的類型僅由線段的線性概括形(走勢)和平面概括姿態(縱橫)決定,具體的如線形粗細、線段的長短、起收筆的法式、直筆的角度,曲筆的弧度等都是相對於字體部件的附屬特徵而不是筆劃的本質。CDL 以客觀原則歸納了39種筆劃*,據載,將其延縮定位(筆劃本身無dimension特徵)後再配以相應的字體特徵,則可組構成CDL數據庫所收納的全部4 萬余字。而傳統的永字八法及中國大陸79年版《辭海》的筆劃檢字表複將39種筆劃進一步概括(不計時間先後)。我們通常所說的橫豎撇點折就是這種更爲抽象的分類。前者CDL之39筆劃可實書成字,不妨稱作抽象的具體,後者之5筆劃只成立於案覈印證,不足以直接拿來作構字的材料,我們管它叫抽象的抽象。張時釗先生的「無字庫漢字」實質上就是基於實書用筆劃加定位符的算式的構字數據庫。「構字」不是造字,而是以成字材料疊構成字。以張氏的數據庫爲例,一箇算式對應一箇確定形態的漢字,對計算機而言,算式(表達式。明晰起見,下稱構字式)的值可以作為函數的自變量(變數)而與之唯一對應的漢字就是應變量,兩者之間是函數關係。SGD的目標之一即是以線性數據和算法重現漢字。
22:46, 19 April 2007 (EDT)~
- 詳見CDL:The Set of Basic CJK Unified Stroke Types
二,「說文解字」
《說文解字》首創了分別部居和因形系連的的概念,顧野王又將篆文的分部法加以提煉,借鑒於眞書。梅膺祚結合書法理論中對筆劃的認識在此基礎上發明了部首和筆劃數配合的檢字法。檢字是漢字字形特徵數據的重要功用之,但傳統意義上的檢字不要求一一對應的關係。部首筆劃檢字法下給定的數據可以對應多箇漢字,所以該法不能實現數據到漢字(確定字形的漢字)的還原。從某個角度來看,《說文》是以分部爲手段講造字機理的書,字形是以形求義以形求實的參考,不是核心的描述對象。如辭條:「度,法制也。从又,庶省聲」——「度」字所從之「又」是明確的形態,而「庶省」則不然,你無法單從一個「省」字中看出到底省在哪里,省了多少。而且又和庶省又是甚麼樣的空間關係呢,文中略而不表。又如:「進,登也。从辵,閵省聲。」閵省聲乾脆就是另外一箇字了。許叔重對文字的解說中最值得注意的是他的拆分講解的思路。《說文》通篇都暗示著:字是可拆解的,至少相對於文而言的字是可拆解的,這樣一種思想。雖然現實中漢字的發展確鑿是按著滋乳、疊合、綴飾這樣的方向進行的,但是自覺的認識到這一點,以至貫徹性地按著這一原理對文字進行全面的分析,這可並不容易。《說文》的影響是空前絕後的,好比今人有把邊旁(偏旁)錯會成部首者就是感性對理論的盲目攀連,亦可見理論之重要。SGD的框架也是對《說文》思想的一種繼承。它所採用的分析方式是基於IDS(詳見The Unicode Standard 4.0 Chapter 11 中介紹IDS的段落,及盛版主張於本版的譯文),原則上是就字論字——像《說文》所載的「某省」之類不在字中的信息則不予採納。
三,結構分析
不清楚這一理論草創於何人。簡單的說,結構分析就是「獨體、合體、左右、上下、包圍」。字的結構是以素材而重現漢字所必不可少的信息。比如「旯旮、陲郵」等,相同的部件(形式上)不同的結構方式就是不同的字。同一部件在不同的位置又有所變化,如阜居左多作阝,邑居右亦多作阝。我們可以通過位置因素來確定同形構字變體「阝」所對應的本字到底是哪一個。又,「郵切」中的的垂、七皆因居左而末筆變形,這是實現視覺再現絕不可忽視的現象。
四、字根(字元)及其他
字根的概念也不知最初是由誰提出的。揚棄了保守漢字的偏見來說話罷:字不是從字根上長出來的,字根的細胞也絕無可能克隆出鮮活的字來。朱邦復、王永民先生的用意當然是好的,可歎步塵者師心自用往往叛離了先驅者的苦心。一句話:輸入法從來也永遠不可能成為漢字的皈依。其實,倉頡、五筆與四角號碼、中國字庋擷一樣,都是漢字的檢索法,以抽象的抽象而無法再現漢字。
IDS
SGD的框架是以IDS爲基礎的。IDS的全稱是 ideographic description sequence,與之易混淆的還有一種 IDC——ideographic description characters,前者由GBK提出,後者由臺灣的中文處理實驗室(CDP)提出。IDC中的 C-characters意爲operators即操作符、運算符、連接符,IDS中的S-sequence指序列、算式、表達式。IDS所提出的表達式規範,使得每一條IDS都是如前文所講的,函數關係中有唯確定值的函數自變量,所對應的應變量也就是唯一確定的漢字。IDC與之相比,不具備唯一確定性,這是弱點之一。此外,按SGD的思想,亦認為IDS的表達式更簡單明晰也因而更準確可靠。
那麼,又來故弄玄虛了,得罪!其實說白了很簡單,舉例如下:
比如「神通廣大」四字,直觀地看,神通廣三個字都不像大字那樣單純,好比,我們說「神」字是「左邊一箇示字旁,右邊一個申字」,像這樣的字,在中國大陸的語文教學中一般就稱作「合體字」,而形如「大」字之「不可分」者,對應的,就叫獨體字。那麼「神、通、廣」用IDS來解析就寫作:神—⿰礻申,通—⿺辶甬,廣—⿸广黃。 你說甚麼?看不清!Zoom! IN! 再IN! 你還在用IE呀,眞拏你沒辦法。 ◫礻申,◳辶甬,◲广黃——這樣看清了吧!如果用IDC寫呢,就是:[礻+申]、[辶@甬]、[广@黃]。 ——這是IDC嗎,騙誰呢!不錯,這是zgheng君作《廣韻》字表時所用的構字符的變體,我如果用IDC寫,你老許是看不到的,因為IDC竝未被 UNICODE採納。不過道理是一樣的。IDC的每一次組合都是中間一箇連接符,兩邊一對括號。假如沒有括號,比方把通字再細分一下:辶@マ/用(“/” 表上下結構。),人或許還能猜出熟識的字來,電腦可不會打燈謎。
簡潔倒算是次要的了,最關鍵是明晰。IDS是由連接符決定部件個數,不僅省掉了括號而且層次也因而清晰。 如,符號◫在表左右結構的同時亦決定了參與構造的部件是兩箇,那麼部字就寫成◫咅阝,若再細分就寫成◫⊟立口阝,也就是在IDS中包含了其他的IDS(序列),每條獨立的IDS是一個字,每條嵌入的IDS是一箇部件。「◫⊟立口阝」隱含地表示了「◫[⊟立口]阝」。這種解析方式其優勢在於它將每箇漢字都歸納成了樹形結構(tree)。而樹是一種非常典型的數據結構(data type),用各種programming language處理起來都很方便。換言之,IDS使漢字的結構分析滿足了可編程條件。
◫⊟立口阝= 部_____立 | |_口 |___阝
長於思考的讀者讀到這裏大概就要發難了,因文中已出現了一些自相矛盾的地方——至少表面上看起來。
◫⊟立口阝=◫咅阝=部,兩種IDS的寫法,究竟哪一箇纔是正確的表述?立字是不是還可以再分,那口、阝呢?咅字《說文》不是作「从丶从否」嘛,你強分成立口又是何道理?
對第一個疑問,我的回答是:都正確。但是,對數據庫而言,對計算機數據處理來講,模棱兩可絕對是大忌,況且也不經濟。SGD的解決辦法是這樣的,數據庫原則上只收錄最簡的IDS構字式,假如用戶選用了如同「◫⊟立口阝」那樣相對複雜的表述形式(立、口畢竟比咅通俗得多),我們自有辦法讓它先轉化成最簡形式(具體如之何,暫且不表),然後再進行後續的處理。
對第二箇疑問,我回答:立字還繼續可分成亠䒑或一上部與一,而口、阝則不可分。這不僅是一個Good question,而且是要命的question——原則問題。重申一下。SGD對漢字字形的分析堅持客觀原則與相對原則。
SGD的核心是一個由IDS構字式到被還原漢字之間的函數,形如:y=f(x)
y是被還原漢字,x是IDS構字式。x的定義域是SGD數據庫所收錄的全部IDS構字式(目前有四萬余條最簡構字式),y的值域就是這些構字所對應漢字的字集。
注意,IDS不能解析所有的已知的和潛在的漢字。x的定義域旣不是無限的,也不是線性的(離散,漢字當然是離散分佈的),這就是SGD對相對原則的具體應用。x定義域以外的字,也就是用IDS無法描述的字,主要是獨體字、特殊合體字和錯雜合體字,具體定義見下文。我說過,SGD還是一個雞子模樣的東東,有些問題尚未得到圓滿解決。我發表此文的一個主要目的就是向諸君求計。
對第三箇疑問,我回答:SGD的原則是就字論字,眞書作何字,SGD就解何字。㕻(⊟丶否)和咅(⊟立口)在眞書中雖然有正奇的關係但絕不是一箇字, IDS的不同就是明證。對SGD對漢字的解析不限於unicode 3.1中的CJK字集,SGD與異體字的問題見下文,㕻咅是否同字的辯證請參閱The Unicode Standard 4.0 Chapter 11中對unification的解釋。
SGD 中的構字式
部件樹與獨立漢字
【1】獨立的漢字也是構字式。沒錯,我們有必要把獨立的漢字也看成是構字式。比如漢字「天」、「地」、「玄」、「黃」,就是四箇構字式。我將獨立漢字的構字式稱作獨立型-singleton。之所以要引入這個概念,就是因為:1,幾乎*所有更複雜的構字式都可以被分析成singletons。2,構字式可以包含子構字式,依前文所述,每條子構字式描述一箇部件,整條構字式描述一箇字。比如,前例的「部」字,可解析爲「◫咅阝」,又可進一步解析作「◫⊟立口阝」,咅本身是一個獨立的字,它在構字式的功能與⊟立口相當,在字與構字式之間竝不存在一道不可逾越的鴻溝,而與此同時,「部」字又可以充當其他字的構成部件,如:「廍」=「◲广部」,所以,在字和部件之間也沒有甚麼明晰的疆界。SGD 將所有的漢字都看成是潛在的構字部件,同時,每一條構字式(包括子構字式。相信各位讀者已然意識到了,這箇「子」字是無關緊要的)都對應一箇潛在的構字部件。所以說,獨立漢字也是構字式,這是對IDS的一條必要補充。
有女同車 22:57, 19 April 2007 (EDT)
- 有一些例外,詳下文。
有女同車 22:57, 19 April 2007 (EDT)
【2】與singleton對應,樹形的類IDS的構字式就稱作複合型- composition.例略。
對composition 的分析
【1】僅由一箇連接符和相應箇數的singletons組成的compostion構字式,我們稱其爲簡單的複合-simple compound。 【2】包含兩箇以上連接符的composition構字式,稱作複雜的複合-complex compound。
應用於前例: ◫咅阝-simple ◫⊟立口阝-complex
如前所述,SGD盡可能地只收錄最簡的構字式。這箇最簡主要就是指simple compound,如果對給定漢字暫時無法進行ids解析,如「一」字、「阝」字,我們就將其作為singleton來處理,這是最簡的另外一個含義。
SGD的第一箇目標就是實現從所有合法構字式到所對應漢字的還原。像「◫⊟立口阝」這樣的complex複合構字式當然是合法的格式,實現從complex到漢字的還原,所採取的手段就是complex2simple的轉換嘗試。
比如漢字「謳」,所對simple compound構字式爲「◫言區」。如果用戶提交的ids爲「◫言⍃匚⊟口◫口口」(「言」加上「匚」和三個「口」(品字)的複雜描述),那麼SGD先將這個複雜的複合型構字式轉換成簡單的複合型構字式「◫言區」,然後再從數據表中查出「◫言區」所對應的漢字「謳」。
但是,並非所有可拆解的漢字都能用simple compound ids來表述。比如「侯」=「◫亻⊟ュ矢」、「冠」=「⊟冖◳元寸」,⊟ュ矢和◳元寸都沒有對應的漢字(侯是矦的隸變異體),但這兩條構字式的確又是最簡的複合型,it's not simple but the simplest,「嘗試」二字就是針對這種情況的,這是「最簡」的含義之三。SGD會將「⊟冖◳⊟一兀寸」先轉換成「⊟冖◳元寸」,然後還原成「冠」字。
All simple compostions are simplest,反之則不然。
對singleton的補充
IDS的全部材料都取自現有字集,確切說就是unicode cjk unified及ext a/b。現有字集中的可拆解字符(直觀上)並不能全部以現有字集中的字符來描述,比如郎的左部、即的左部、经的右部等,unicode現有字集中並沒有這些字或部件。另有一些字從造字機理上看包含某獨立漢字的省形,如「傷」字依《說文》從「𥏻」省,「度」從「庶」省,而「𥏻」省、「庶」省都不成字。此外,還有一些部件,雖然從造字機理上講不通,但在眞書中確有類推應用,如「秦、泰、春、舂」的上部,「表、毒、青、責」的上部等。前文反復強調,SGD以客觀原則而就字論字。所以有必要補充一些客觀存在的部件以滿足ids解析的需要。SGD是反對主觀臆斷的字根的,它以如下兩種方式來描述這些補充部件。
【1】V-singleton.SGD引入了變體的概念,V是variant的縮寫。此類部件主要是指那些原本獨立的漢字在充當構字部件時的特殊寫法。如前文所舉「郎」字,其左部就是「良」字在左右結構的合體字中充當居左部件時的變體。類似的如「騰、謄」的左上部是「𣎌」字的變體,「卷」字的上部是「𢍏」字的變體。又如「经」右部是「巠」的字簡化變體,「陥」右部是「臽」字的日文漢字變體。理論上一箇字符可以有多種變體,但目前SGD只引入了一種單一的標識方式,即在正體字符前加標識符V,如以V良標示郎左,以V臾表示「䛕」右。所有的變體部件都是 singleton,功能上與獨立漢字的singleton相當。
【2】X-singleton.此類部件是用於描述那些省字和無理部件的。如度字從庶省,從又,庶省的X-singleton 表述爲「◲庶X」;又如,島字從鳥省從山,鳥省的X-singleton 表述爲「◱鳥X」。X-singleton也是一種變體,標識某些獨立漢字去掉特定部位部件後的形態。它的表述形式有一定的描述性,看上去像是一種逆成的 IDS——好比「◲庶X」等价於:假定庶=◲YX,求Y——但它不是IDS,只是一種標識,在IDS表達式中它的功能與獨立漢字的singleton相當。
既然上述兩種特殊的部件表述方式都被看做singleton,那麼對simple compound的定義可以擴展爲:只包含一個連接符和相應個數singlegons/X-singletons/V-singletons的 composition構字式。如「◲◲庶X又」(度)、「H纟V巠」(经)也都是simple的。
SGD中的IDS連接符
在SGD中,IDS表達式中的連接符號以「神似」的大寫羅馬字母代替,這是因為;一方面,在utf-8格式中羅馬字母只占一箇字節,比較經濟;另一方面, postgres對ids operators和上文所用的一些幾何符號的處理有一些bug;再者就是,羅馬字母也能給用戶帶來方便,畢竟現在通行的IME和鍵盤佈局中還很少有支持這些字符的錄入的。 SGD所用連接符和標識符全表如下:
⿱ | ⊟ | Z | 2 | 上下 |
⿰ | ◫ | H | 2 | 左右 |
⫴ | W | 3 | 左中右 | |
⿳ | ⌸ | E | 3 | 上中下 |
⿴ | ⧈ | O | 2 | 包圍 |
⿷ | ⍃ | C | 2 | 左包圍 |
⿶ | ⍌ | U | 2 | 下包圍 |
⿵ | ⍓ | N | 2 | 上包圍 |
⿸ | ◲ | P | 2 | 左上包圍 |
⿺ | ◳ | L | 2 | 左下包圍 |
⿹ | ◱ | Q | 2 | 右上包圍 |
┛ | ◰ | J | 2 | 右下包圍 |
〾 | ≆ | V | 1 | V變體 |
〿 | ☒ | X | 0 | X變體占位符 |
⧉ | D | 2 | 重疊 |
SGD 的 backend(後端)
我已整理了49303箇CJK字符的最簡構字式,包含CJK unified 字集的絕大多數字符和ext a/b的部分字符。其中未拆解的singletons 782個,simple compound 47478 個。
SGD現以postgresQL關係型數據庫管理系統(rdbms)爲載體,選擇postgres的原因是出於下述這些方面的考慮:
1)postgres是自由、開源軟件。SGD也是自由開源軟件。暫擬以GPL發佈。 2)postgres是跨平臺的功能完備的而且號稱是最高級的 free rdbms系統,有廣大的用戶羣和豐富的技術資源。 3)postgres對SQL國際標準有相當容程度的兼容,作為國際標準的追隨者,我很自然地要選擇更規範的postgres而不是mySQL。 4)postgres支持procedure language(PL,過程語言)的後端編程,PL/pgsql是sql語言的擴展,後端編程可以提高數據庫的操作效率,而且sql也是我比較熟悉的語言,選擇它可以縮短我的學習曲線。 5)postgres 對unicode plane2部分的字符支持良好。這可能是最重要的一個原因。比如,在postgres中用length函數獲取字符串長度,length ('Q𢦏木')(栽的ids)的結果是3而不是其他的甚麼莫名其妙的數值。
postgreSQL 下載地址: http://www.postgresql.org/download/ postgreSQL的安裝配置不在本文的討論範圍之内,這裏簡單說幾句,詳細指導請參考官方網站的相關信息。
postgreSQL在M$ windows xp下的安裝很簡單,幾乎可以單擊完成。應注意的是,自動安裝的可執行文檔要求安裝目錄必須在NTFS格式的硬盤分區中。當然,如果是手工安裝也可以安裝到其他格式的分區中,只是我沒試過。安裝包中附帶圖形界面的客戶端管理程序pgAdmin III,數據庫的維護,SQL語言查詢,PL函數的編寫調試都可以在此界面下實現。
這裏是實驗階段的SGD數據庫備份文件的壓縮檔,你可以將它恢復到你的數據庫中,擺弄擺弄,看看好不好用。
SGD已實現的和部分實現的功能
將IDS表達式解析成部件樹
函數名:ids_tree(ids_exp,pos) 參數1_ids_exp:IDS 表達式或singleton 參數2_pos:(子)IDS表達式在部件樹上所對應節點的ID,遞歸調用時會用到此參數,初始值應設爲 null 或 。 返回值:無。該函數將IDS表達式的樹形分析結果及中間值保存在table ids_components_buffer中。每一次調用都會更新此table。
實例: select ids_tree('H言C匸Z口H口口'null); select * from idsa_components_buffer order by position; 更新後的 idsa_components_buffer 如圖:
position爲節點的ID;operator爲連接符,singleton的連接符就是singleton本身;type是節點的類型;length是該節點所包含的子節點數;start和end是節點在ids字符串中的起止位置。
由IDS表達式還原CJK字符
函數名:ids2cjk(ids_exp) 參數_ids_exp:IDS表達式或singleton 返回值:所對應的CJK字符
實例: select ids2cjk('H言C匸Z口H口口'); 返回「謳」