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 组字对做一张“汉字视力表”吧:
最后的视力表让人彻底无语……
柬字最好找。
终于有位置坐了…最后的视力表非常强大…
谁告诉我一下已到底在哪里……
好晕,好晕~!
“已”在最后一行的倒数第三个。
可耻地Ctrl+F
同时我有一个预感,总觉得这篇文章最后面那一部分会出现在各个校内日志上
被视力表吓到了……
还没看就晕了
已经出现在校内了~~
OMG,可怕的视力表!
把那个视力表推荐给空军吧
我来发布一下答案吧.
这些字分别在:
第三行中间
最后一行中间
第二行前面
第三行后面
倒数第二行中间
倒数第三个字
牛!
高亮关键字秒杀!
楼上是什么浏览器啊. 太牛了. 可以检索图片中的关键字. 那岂不是验证码也可以autofill了?
我也觉得柬字最好找, 那个壳反而难找, 可能最后的模糊算法还是跟人脑的模式不一样.
最后的视力表看晕了……
我是来跪拜的!!
好…囧…
英文呢?
搜了一下没出结果,仔细一看后面的全是图片……
好文章啊,看得激情澎湃,还有这么严谨的东东呢,不过看完视力表就发现我的视力太差了。
我靠。。。。12px还要不要人活。。。。
我表示视力很差。。。
我无耻的用到了Ctrl+滚轮
Mac+Safari的话,可以双指缩放……
~~~~~
shit
fuck!
眼睛!!我的眼睛!!
视力表。。。直接晕掉。。。
12×12 + GB 字符集哪里过瘾!
强烈要求博主强力检索 Unicode,尤其是增补 B、C 区还有 HKSCS 区,这是各大词库普遍薄弱的地方。
其实从钱里找到我也是很难的wwww
Ctrl+F,全部秒杀
膜拜大牛
真是很有意思。
一点小小的建议:文中图示似乎不能解释需要模糊化的原因。因为如果我们不作模糊化,而只是用manhattan距离,也就是 sum_i |m_i – n_i |,也能判断出 A和B相差两个像素,而A和C只是相差一个像素。
模糊化的重要性的例子似乎可以是 “柬”和“束”这样的区别 —— 模糊化填补了两个封闭小区域,从而使得封闭区域中是否有那么个小点显得不那么重要了。
严重鄙视那个视力表……看得好晕
好累!终于全部找完了,累死眼睛了……
Orz…
放大放大
顺便鄙视
~~
找字很容易,只要Ctrl-F!:)
有意思,拿开源的
文泉驿
字体来看看会如何?
视力表那个应该是出自水木Joke版的”神经系统测试”活动吧.
如果在GBK范围内, 最相似的应该是凉和凉
凉凉 这两个竟然不是同样的字。。。。。
赶快去学桥牌!!
能否据此设计出一个汉字转换表,用来避开敏感词过滤?
我现在还是没看出来42楼那俩字哪不一样
看来最后的视力表。。。瞎了
@#42 Aule:前一个是 GB 专用字符,后一个是被 Unicode 收录的 GB 字符。在进行字符集转换时,前一个会自动被转换成后一个。
这种情况在增补区出现之后更为常见,比如“”(GB 专用字符)与“䴙䴘”(CJK 扩展 A 区简体字符)。
Unicode 中还有个 CJK 兼容区,很有利用价值。举例来说:什、什,不、不,力、力,了、了,年、年。
妈啊,见到大牛了哇
其实,如果考虑到我们平常的人手写字并没有电脑那么标准,那么很多相似的字都被忽略掉了。譬如我们日常中会认为贪和贫的相似度远比贵和贪要高,层和屋比厘和屋要高。有时候不仅是像素的问题,我觉得笔画的角度,横多还是竖多来的更重要,不过这样考虑博主电脑估计要算几年了。
我是用放大镜找的,算么= =?
看前面的过程觉得真有钻研精神,但这样的相似似乎也没什么用。
但看到后面的视力表我笑喷了,原来编程还能这么好玩
呵呵. 一眼就见到已了,倒数第三个~
柬 的像素数比 束 多,所以好找。
柬字最好找
实在是太变态了。。。
都看晕了,唉
感觉“束”和“柬”比较容易分辨,点比其他比划更容易分辨,特别是字正中的
己这个。。。。
拓展一下,可以玩
人面识别,
第一个和最后一个我都找到了
我只能膜拜。。。
哥,你太牛逼了
看了很久还是没看懂
眼花了
膜拜…无语ing
被人发到ACFUN上去了- –
44楼的想法不错啊,利用这个替换敏感词 – –
在ACFUN上看到这帖,一看就觉像是m大的风格(记得上次MM查全唐诗的对偶字。。。)文末果然看到了M67牛的名字。。。
ht tp://220.170.79.105/html/art/20100313/84281.html
再次致敬~~~
还有最近有个想法(已经做出来但是没发,准备再研究研究)。是个很火星的帖了,用MM绘制双幅抖动GIF使函数图像产生立体感,现在的做法还有个更简单的:分别用淡蓝淡红去绘制两个图像,然后用左右眼分别用红蓝滤光镜就能看到很有立体的函数图像。M大不妨一试
问23楼,sum_i |m_i – n_i | i是什么?
很容易找啊,只要不看全字,当它是图像,只盯着两个字不同的那个地方扫过去就可以了。
~~~~请问
用Mathematica可否做到
让我只输入几笔的连续笔画
从而找出包含有该几笔连续笔画的全部汉字呢?
我有特殊用途
每次翻字典把眼睛都弄花了。。。。
如果可以的话
不知道我是否有幸能够认识下本文作者呢?
我QQ307707488
如果能给下联系方式
我真是涕泪俱下万分感激啊
期待您的答复
太牛逼了吧
最后的视力表太过给力,眼晕中
Mathematica 资料 而来 路过
有些复杂,有点补明白,求解!
说的不错!!
这个碉堡了= =
眼睛都晕了。找了3个,
好(xia)看(yan)
`于是,我利用上面这些函数写了一段 Mathematica 程序,跑了几个小时的时间终于得出了在 3755 个一级汉字所对应的宋体 12 像素点阵字中像素不同之处最少的字对。`
所以这段程序的代码在哪里?能够提供一下吗?
最后的汉字视力表并不是那么完美,至少有以下几个问题:
1.字太小,很多笔画并不完整,不能够反应字的真实相似度
2.人眼容易区分颜色而不容易区分形状,比如柬和束,多出的的点与周围的白色对比鲜明,反而好找。
3.整齐的排列使得一些取巧的方法得以成立,比如关注竟和竞,在图示字体大小下,竟的“日”与“立”相连,而竞没有,可以通过观察“立”与“口”之间的一条空白线在哪里被黑点截断发现。