Mathematica 提供了一個看上去毫無用途的無厘頭函數 Rasterize ,它可以以圖片的格式輸出運算結果。比如,下面這個句子可以列印出 (x+1)^n 的展開式的“倒影”:
今天我突然想到,我們可以利用這個函數很方便地分析漢字在圖象上的性質。函數 Binarize 可以把圖象轉換為單色單通道, ImageData 則可以把圖象轉換成數組的形式,以便我們定量分析。因此,下面這句話就可以把一個漢字轉換成 12*12 的 01 矩陣:
下面這幾句話可以把 GB2312 中的最常用的 3755 個一級漢字按照宋體 12 像素點陣字的像素點多少進行排序。
可以看到,像素點最少的 10 個漢字為:
像素點最多的 10 個漢字則為:
曾經多次在網上看到諸如“三秒鐘之內找到我”、“你吃過康帥博即食麵嗎”之類的文章,不由得感歎漢字之強大。於是我開始思考,漢字中哪些字對長得最像?於是,我利用上面這些函數寫了一段 Mathematica 程式,跑了幾個小時的時間終於得出了在 3755 個一級漢字所對應的宋體 12 像素點陣字中像素不同之處最少的字對。其中有一對字僅一個像素之差,它們是“己”和“已”字。其它的一些結果如下:
只差 2 個像素:(鳴,嗚), (柬,束), (竟,競)
只差 3 個像素:(殼,亮), (含,合)
只差 4 個像素:(上,土), (免,兔), (兵,乒), (士,土)
只差 5 個像素:(夫,失), (臣,巨), (未,朱), (宜,直)
但是,我對上面這個結果並不滿意,因為有這麼一個問題被忽略掉了:雖然相差相同數量的像素點,但差異發生在不同的地方,主觀上的視覺差別程度是不同的。比方說,同樣只差 4 個像素,人們會覺得 (士,土) 之間的差異遠遠小於 (上,土) 之間的差異。我們可以用一個更簡單的例子來說明這種情況:
圖 A 和圖 B 、圖 A 和圖 C 都只差一個像素,但從人眼的角度來看,圖 C 要和圖 A 接近一些。這是為什麼呢?或許這就是人和機器的區別吧。機器能夠精確地知道每個像素的位置,但人卻很難做到這一點,一般只能分辨出每個像素的一般位置。為了類比人眼的感受,我想到把所有的漢字全部模糊化,讓每個像素點都在其周邊留下一些影子,這相當於從一個近視眼的角度去量化字形的差異。
對前面的三個例圖進行模糊並轉化為 256 灰階後,圖 A 和圖 B 的各像素灰階值的差值的平方和為 33699 ,圖 A 和圖 C 的各像素灰階值的差值的平方和則為 29330 ,後者比前者小得多。又是幾個小時的時間, Mathematica 終於找出了在這個意義下字形最接近的 50 個字:
(己,已), (竟,競), (鳴,嗚), (柬,束), (殼,亮), (含,合), (免,兔), (莢,英), (士,土), (宜,直)
(並,井), (杜,社), (夫,失), (侍,恃), (昔,音), (未,朱), (囤,圍), (檢,撿), (昧,味), (桶,捅)
(末,未), (懦,儒), (著,著), (上,土), (兵,乒), (素,索), (臣,巨), (迸,進), (蓋,蠱), (槐,愧)
(優,憂), (官,言), (擋,檔), (醇,酵), (檸,擰), (繭,苗), (兒,幾), (蓬,篷), (供,洪), (冪,幕)
(扁,肩), (貴,貪), (金,全), (借,惜), (厘,屋), (析,折), (戍,戌), (大,太), (悄,俏), (失,矢)
這些字究竟相仿到什麼程度呢?讓我們用上面這個列表中的頭 6 組字對做一張“漢字視力表”吧: