用Mathematica寻找最相似的汉字
icon2 Program Impossible | icon4 2010-03-08 22:38| icon376 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

    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 组字对做一张“汉字视力表”吧:

   

 
 
 

76 条回复

  • 楼层: 沙发 | | 006 说:

    最后的视力表让人彻底无语……

  • 楼层: 板凳 | | 高考完了 说:

    柬字最好找。

  • 楼层: 地毯 | | Climber.pI 说:

    终于有位置坐了...最后的视力表非常强大...

  • 楼层: 地板 | | maa04 说:

    谁告诉我一下已到底在哪里……

  • 楼层: 地下室 | | cat 说:

    好晕,好晕~!

  • 楼层: 地基 | | primenumber 说:

    "已"在最后一行的倒数第三个。

  • 楼层: 地壳 | | 严酷的魔王 说:

    可耻地Ctrl+F

  • 楼层: 地幔 | | 严酷的魔王 说:

    同时我有一个预感,总觉得这篇文章最后面那一部分会出现在各个校内日志上

  • 楼层: 地核 | | LK 说:

    被视力表吓到了......
    还没看就晕了

  • 楼层: 10楼 | | Enzojz 说:

    已经出现在校内了~~

  • 楼层: 11楼 | | jooey 说:

    OMG,可怕的视力表!

  • 楼层: 12楼 | | maxint64 说:

    把那个视力表推荐给空军吧

  • 楼层: 12a楼 | | Phil 说:

    我来发布一下答案吧.
    这些字分别在:

    第三行中间
    最后一行中间
    第二行前面
    第三行后面
    倒数第二行中间
    倒数第三个字

  • 楼层: 14楼 | | boboyang 说:

    牛!

  • 楼层: 15楼 | | magiclin 说:

    高亮关键字秒杀!

  • 楼层: 16楼 | | Phil 说:

    楼上是什么浏览器啊. 太牛了. 可以检索图片中的关键字. 那岂不是验证码也可以autofill了?

  • 楼层: 17楼 | | diyism 说:

    我也觉得柬字最好找, 那个壳反而难找, 可能最后的模糊算法还是跟人脑的模式不一样.

  • 楼层: 18楼 | | lukmy 说:

    最后的视力表看晕了……

  • 楼层: 19楼 | | peacedog 说:

    我是来跪拜的!!

  • 楼层: 20楼 | | yegle 说:

    好…囧…

  • 楼层: 21楼 | | crazylamb 说:

    英文呢?

  • 楼层: 22楼 | | jimogsh 说:

    搜了一下没出结果,仔细一看后面的全是图片……

  • 楼层: 23楼 | | walker44 说:

    好文章啊,看得激情澎湃,还有这么严谨的东东呢,不过看完视力表就发现我的视力太差了。

  • 楼层: 24楼 | | est 说:

    我靠。。。。12px还要不要人活。。。。

  • 楼层: 25楼 | | L 说:

    我表示视力很差。。。

  • 楼层: 26楼 | | PhiloEve 说:

    我无耻的用到了Ctrl+滚轮
    Mac+Safari的话,可以双指缩放……
    ~~~~~

  • 楼层: 27楼 | | pluto 说:

    shit

  • 楼层: 28楼 | | luojiewei 说:

    fuck!

  • 楼层: 29楼 | | zszen 说:

    眼睛!!我的眼睛!!

  • 楼层: 30楼 | | flyink 说:

    视力表。。。直接晕掉。。。

  • 楼层: 31楼 | | xslidian 说:

    12x12 + GB 字符集哪里过瘾!
    强烈要求博主强力检索 Unicode,尤其是增补 B、C 区还有 HKSCS 区,这是各大词库普遍薄弱的地方。

  • 楼层: 32楼 | | az508 说:

    其实从钱里找到我也是很难的wwww

  • 楼层: 33楼 | | 老白 说:

    Ctrl+F,全部秒杀

  • 楼层: 34楼 | | yuan 说:

    膜拜大牛

  • 楼层: 35楼 | | yiwang 说:

    真是很有意思。

    一点小小的建议:文中图示似乎不能解释需要模糊化的原因。因为如果我们不作模糊化,而只是用manhattan距离,也就是 sum_i |m_i - n_i |,也能判断出 A和B相差两个像素,而A和C只是相差一个像素。

    模糊化的重要性的例子似乎可以是 “柬”和“束”这样的区别 —— 模糊化填补了两个封闭小区域,从而使得封闭区域中是否有那么个小点显得不那么重要了。

  • 楼层: 36楼 | | Jason911 说:

    严重鄙视那个视力表……看得好晕

  • 楼层: 37楼 | | Leos 说:

    好累!终于全部找完了,累死眼睛了……

  • 楼层: 38楼 | | dEs. T 说:

    Orz...

  • 楼层: 39楼 | | yangff 说:

    放大放大
    顺便鄙视
    ~~

  • 楼层: 40楼 | | lietlie 说:

    找字很容易,只要Ctrl-F!:)

  • 楼层: 41楼 | | dvaknheo 说:

    有意思,拿开源的

    文泉驿

    字体来看看会如何?

  • 楼层: Answer to Life, the Universe, and Everything | | zionius 说:

    视力表那个应该是出自水木Joke版的"神经系统测试"活动吧.
    如果在GBK范围内, 最相似的应该是凉和凉

  • 楼层: 43楼 | | 小猫 说:

    赶快去学桥牌!!

  • 楼层: 44楼 | | aleung 说:

    能否据此设计出一个汉字转换表,用来避开敏感词过滤?

  • 楼层: 45楼 | | Aule 说:

    我现在还是没看出来42楼那俩字哪不一样

  • 楼层: 46楼 | | 额 说:

    看来最后的视力表。。。瞎了

  • 楼层: 47楼 | | xslidian 说:

    @#42 Aule:前一个是 GB 专用字符,后一个是被 Unicode 收录的 GB 字符。在进行字符集转换时,前一个会自动被转换成后一个。
    这种情况在增补区出现之后更为常见,比如“”(GB 专用字符)与“䴙䴘”(CJK 扩展 A 区简体字符)。
    Unicode 中还有个 CJK 兼容区,很有利用价值。举例来说:什、什,不、不,力、力,了、了,年、年。

  • 楼层: 48楼 | | saythink 说:

    妈啊,见到大牛了哇

  • 楼层: 49楼 | | morrowind 说:

    其实,如果考虑到我们平常的人手写字并没有电脑那么标准,那么很多相似的字都被忽略掉了。譬如我们日常中会认为贪和贫的相似度远比贵和贪要高,层和屋比厘和屋要高。有时候不仅是像素的问题,我觉得笔画的角度,横多还是竖多来的更重要,不过这样考虑博主电脑估计要算几年了。

  • 楼层: 50楼 | | 光头牙医 说:

    我是用放大镜找的,算么= =?

  • 楼层: 51楼 | | fenghan 说:

    看前面的过程觉得真有钻研精神,但这样的相似似乎也没什么用。
    但看到后面的视力表我笑喷了,原来编程还能这么好玩

  • 楼层: 52楼 | | 柳城 说:

    呵呵. 一眼就见到已了,倒数第三个~

  • 楼层: 53楼 | | biohu 说:

    柬 的像素数比 束 多,所以好找。

  • 楼层: 54楼 | | Alicante 说:

    柬字最好找

  • 楼层: 55楼 | | T 说:

    实在是太变态了。。。

  • 楼层: 56楼 | | www.28.com 说:

    都看晕了,唉

  • 楼层: 57楼 | | DaveJ 说:

    感觉“束”和“柬”比较容易分辨,点比其他比划更容易分辨,特别是字正中的

  • 楼层: 58楼 | | wuzhengkai 说:

    己这个。。。。

  • 楼层: 59楼 | | shuge.lee 说:

    拓展一下,可以玩
    人面识别,

  • 楼层: 60楼 | | 寻找最相似的汉字(附汉字视力表) « 每日IT新闻,最新IT资讯,聚合多站点消息,保证你与世界同步 说:

    [...] Matrix67 同学用Mathematica 把 GB2312 中的最常用的 3755 个一级汉字按照宋体 12 像素点阵字的像素点多少进行排序,以寻找最相似的汉字。其中得出一些有趣的结果: [...]

  • 楼层: 61楼 | | Steven 说:

    第一个和最后一个我都找到了

  • 楼层: 62楼 | | Diki.cn » Blog Archive » 寻找最相似的汉字 说:

    [...] Matrix67 同学用Mathematica 把 GB2312 中的最常用的 3755 个一级汉字按照宋体 12 像素点阵字的像素点多少进行排序,以寻找最相似的汉字。其中得出一些有趣的结果: [...]

  • 楼层: 63楼 | | Notwhy 说:

    我只能膜拜。。。

  • 楼层: 64楼 | | thomaw.w 说:

    哥,你太牛逼了

  • 楼层: 65楼 | | 杨忠平 说:

    看了很久还是没看懂

  • 楼层: 66楼 | | 慕青 说:

    眼花了

  • 楼层: 67楼 | | 这周我加星 – 2010年03月13日 : 这周我加星 说:

    [...] 用Mathematica寻找最相似的汉字 [...]

  • 楼层: 68楼 | | Eagle_Fantasy 说:

    膜拜...无语ing

  • 楼层: 69楼 | | 金坷拉 说:

    被人发到ACFUN上去了- -

  • 楼层: 71楼 | | 宇文笨兔 说:

    44楼的想法不错啊,利用这个替换敏感词 - -

  • 楼层: 72楼 | | Fletin 说:

    在ACFUN上看到这帖,一看就觉像是m大的风格(记得上次MM查全唐诗的对偶字。。。)文末果然看到了M67牛的名字。。。
    ht tp://220.170.79.105/html/art/20100313/84281.html
    再次致敬~~~

    还有最近有个想法(已经做出来但是没发,准备再研究研究)。是个很火星的帖了,用MM绘制双幅抖动GIF使函数图像产生立体感,现在的做法还有个更简单的:分别用淡蓝淡红去绘制两个图像,然后用左右眼分别用红蓝滤光镜就能看到很有立体的函数图像。M大不妨一试

  • 楼层: 73楼 | | Lizard King 说:

    问23楼,sum_i |m_i - n_i | i是什么?

  • 楼层: 74楼 | | hotshots 说:

    很容易找啊,只要不看全字,当它是图像,只盯着两个字不同的那个地方扫过去就可以了。

  • 楼层: 75楼 | | ~~~~飞离思 说:

    ~~~~请问

    用Mathematica可否做到

    让我只输入几笔的连续笔画

    从而找出包含有该几笔连续笔画的全部汉字呢?

    我有特殊用途

    每次翻字典把眼睛都弄花了。。。。

    如果可以的话

    不知道我是否有幸能够认识下本文作者呢?

    我QQ307707488

    如果能给下联系方式

    我真是涕泪俱下万分感激啊

    期待您的答复

  • 楼层: 76楼 | | 北京婚纱摄影工作室 说:

    太牛逼了吧

您也随便说几句吧:

您可以在 Gravatar 设置您的头像。