V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JCZ2MkKb5S8ZX9pq
V2EX  ›  程序员

怎么找出近似的汉字?

  •  2
     
  •   JCZ2MkKb5S8ZX9pq · 2019-03-14 17:16:17 +08:00 · 7182 次点击
    这是一个创建于 2082 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 想找出笔划差别细微的汉字。
    • 比如 [余] 和 [佘] , [茶] 和 [荼] 。
    • 一种思路是在给定字体下,渲染成固定尺寸的图片,然后 bitmap 比较汉明距离。
    • 但这样碰到偏旁缩放的字可能会误判,比如 [侯] 和 [候] 。
    • python 下有啥现成的轮子嘛?
    • 或者大家还有啥别的思路嘛?
    第 1 条附言  ·  2019-03-14 18:04:57 +08:00

    补充说明:

    • 我需要的结果,就是要做出映射表。
    • 需要包含的字库,差不多是思源/萍方/雅黑的交集。
    • 使用目的,是混淆文字。
      按一定规则,混淆文字,以最小影响阅读体验的代价,做内容保护和溯源。
    • 所以需要能够量化差异,仅选取差异小于阈值的字。
    • 等于是个汉字不可逆加密。

    • 其它混淆方法:插空格、discus插乱码、部分字转拼音、部分字转繁体等等,我也知道。
      但就想到这个了,想试看看怎么实现。
    • 通过笔划判断应该不行,理由见20楼。
    67 条回复    2020-08-11 21:16:18 +08:00
    vJianZhen
        1
    vJianZhen  
       2019-03-14 17:18:58 +08:00   ❤️ 1
    建一个映射表,把所有近似字都录入进去
    ymcj001
        2
    ymcj001  
       2019-03-14 17:19:51 +08:00 via Android
    @vJianZhen 足够暴力
    x86
        3
    x86  
       2019-03-14 17:20:29 +08:00
    参考下手写输入法
    lastpass
        4
    lastpass  
       2019-03-14 17:24:37 +08:00 via Android
    常用字就 3 千,
    字型相似的汉字有限且不多。
    直接映射。
    简单粗暴还好用。
    jingxyy
        5
    jingxyy  
       2019-03-14 17:27:01 +08:00
    没毛病,1 楼靠谱
    danielmiao
        6
    danielmiao  
       2019-03-14 17:29:54 +08:00   ❤️ 2
    可以先对图片侵蚀和膨胀,最后对图片异或处理,简单的话就简单的判断 1 的比重用阈值处理,复杂就扔到神经网络,做一批训练样本,学习下
    vJianZhen
        7
    vJianZhen  
       2019-03-14 17:32:57 +08:00
    @ymcj001 汉字本来就少啊。楼主也没说具体需求。这种办法好得很
    JCZ2MkKb5S8ZX9pq
        8
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:37:44 +08:00
    @vJianZhen 我就想问怎么建映射表
    你说的方法手动一个个比?
    JCZ2MkKb5S8ZX9pq
        9
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:38:26 +08:00
    @lastpass 我就是想问映射表哪儿来?
    pkokp8
        10
    pkokp8  
       2019-03-14 17:39:11 +08:00 via Android
    五笔?
    ifxo
        11
    ifxo  
       2019-03-14 17:39:33 +08:00
    没办法的,用嘴当然好做了
    lastpass
        12
    lastpass  
       2019-03-14 17:39:42 +08:00 via Android
    另外:别去分析图片。
    直接通过区位码读点阵字库的点阵内容就好。
    JCZ2MkKb5S8ZX9pq
        13
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:41:28 +08:00
    @lastpass 区位码我去看看哦
    而且因为是找近似字,范围应该不限于常用字,而是常用的 unicode 大字库了,比如微软雅黑 /思源 /萍方的交集,差不多这个范围里找。
    lastpass
        14
    lastpass  
       2019-03-14 17:42:09 +08:00 via Android
    回复 @JCZ2MkKb5S8ZX9pq 搜索了一下。有对应的书籍。是否全面就不知道了。人工穷举也是个办法啊。比你花费时间去写程序跑出来结果更快更简单呀。
    JCZ2MkKb5S8ZX9pq
        15
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:45:12 +08:00
    @lastpass 查了下
    [GB 2312 - 维基百科,自由的百科全书]( https://zh.wikipedia.org/wiki/GB_2312)
    16~55 区( 3755 个):常用汉字(也称一级汉字),按拼音排序;
    56~87 区( 3008 个):非常用汉字(也称二级汉字),按部首 /笔画排序;
    按拼音排序,好像并不适合用来做识别。
    lastpass
        16
    lastpass  
       2019-03-14 17:47:04 +08:00 via Android   ❤️ 1
    JCZ2MkKb5S8ZX9pq 非常好找。直接鄙视链最底端的百度文库都有。
    https://m.baidu.com/sf_edu_wenku/view/35840bfebe23482fb5da4c04.html?re=view
    ebingtel
        17
    ebingtel  
       2019-03-14 17:47:04 +08:00
    别用图片比较吧……每个汉字都有自己的笔画(网上很多开源的),感觉可以根据笔画向量来查找
    JCZ2MkKb5S8ZX9pq
        18
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:47:10 +08:00
    @lastpass 人工穷举不太可能啊,字太多了,排序又不规则,两两比较就算只有 3000 个,这也太夸张了。况且很多近似字都是冷门生僻字,字库范围就不能按 3000 来算。
    JCZ2MkKb5S8ZX9pq
        19
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:49:30 +08:00
    @lastpass 感谢提供的百度链接,但这个不大符合我的预期。
    一方面近似度差了点,一方面不够量化,多近多远没个准。
    JCZ2MkKb5S8ZX9pq
        20
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:52:42 +08:00
    @pkokp8 @ebingtel 我自己手机就用的笔划输入法,真的不行。
    笔划是天上一脚地上一脚,差个位置差很远。
    比如
    [林] 横竖撇捺横竖撇捺
    [扶] 横竖撇捺横横撇捺
    JCZ2MkKb5S8ZX9pq
        21
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 17:53:45 +08:00
    @pkokp8 @ebingtel 打错了 是 [枎]
    tyrealgray
        22
    tyrealgray  
       2019-03-14 17:54:54 +08:00 via Android
    介意问一下楼主打算做一个什么系统用于哪方面吗?
    dorentus
        23
    dorentus  
       2019-03-14 17:55:09 +08:00   ❤️ 1
    JCZ2MkKb5S8ZX9pq
        24
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-14 18:05:24 +08:00
    @tyrealgray 我在 append 里补充了一下
    shyrock
        25
    shyrock  
       2019-03-14 18:21:24 +08:00
    可以用字型输入法的编码来比较吧,比如五笔。
    gliyechen
        26
    gliyechen  
       2019-03-14 18:24:06 +08:00
    1 楼方法不是挺好的嘛 还可以用在不同字体
    lneoi
        27
    lneoi  
       2019-03-14 18:24:09 +08:00
    如果说找相近汉字, 不能只在常用汉字表里面互相比对吧,还得看异体字,国外汉字什么的?
    xml123
        28
    xml123  
       2019-03-14 18:31:11 +08:00   ❤️ 9
    across
        29
    across  
       2019-03-14 18:34:14 +08:00
    除了暴力计算(感觉 CUDA 派上用场了?),估计只能靠输入法收集用户数据了.

    做好了估计还能当个商业库呢~~
    jdhao
        30
    jdhao  
       2019-03-14 19:01:46 +08:00 via Android
    计算图像相似度?(一个猜想,不一定对
    tusj
        31
    tusj  
       2019-03-14 19:09:49 +08:00
    我一直好奇十几年前流行的火星文字,是怎么搞出来的。
    有没可能用它来做混淆?
    c4f36e5766583218
        32
    c4f36e5766583218  
       2019-03-14 19:57:00 +08:00
    按一定规则,混淆文字,以最小影响阅读体验的代价,做内容保护和溯源???
    按你这方法混淆了那文章含义不是变样了?句子不通了啊~
    hdjs5264
        33
    hdjs5264  
       2019-03-14 20:04:11 +08:00   ❤️ 1
    emmmm,你这需求不就是火星文?
    glacer
        34
    glacer  
       2019-03-14 20:08:51 +08:00
    能否拿到汉字的像素值?比如在 8x8 的矩阵中,空白点像素为 0,笔画点像素为 1,得到一个 64 位的向量。然后通过一些相似度算法计算即可。
    nccer
        35
    nccer  
       2019-03-14 20:11:51 +08:00
    火星文?
    rekulas
        36
    rekulas  
       2019-03-14 20:14:39 +08:00
    直接导入深度学习文字识别库,准确率>60 的就是
    mxtob
        37
    mxtob  
       2019-03-14 20:18:24 +08:00 via iPhone
    之前在思否看过一个解答。用 gd 库绘画需要 2 个比对文字,然后用图片相似度算法
    JCZ2MkKb5S8ZX9pq
        38
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-15 01:39:41 +08:00
    @c4f36e5766583218 我觉得这个主要还是看比例,比如五千字的文章里换掉五个字,应该问题不大。再比如我这段话里就焕掉了—个字,但对阅読的影响应该不会很大。
    JCZ2MkKb5S8ZX9pq
        39
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-15 01:48:39 +08:00

    黑色占比 0.13484312996031747


    黑色占比 0.16272941468253968


    差别比例 0.48925163811932404

    =====

    进展汇报

    试了几种图形识别的方式,都不大完美。
    即便用点阵字体+bitmap 纯黑白,也不大理想。
    况且我希望的结果是混淆人眼识别,有些比如 [辛] 和 [幸] 和 [亲] ,程序会觉得 13 更接近。
    所以感觉这个问题比预想的还复杂一点。

    笔划近似的确是一个思路,但还没想好怎么量化。
    kuangwinnie
        40
    kuangwinnie  
       2019-03-15 01:57:00 +08:00
    卷积神经网络?
    akira
        41
    akira  
       2019-03-15 02:01:24 +08:00
    找以前的汉字库 16x16 像素的 ,然后随便做个图片相似度算法 应该就能满足你了
    c4f36e5766583218
        42
    c4f36e5766583218  
       2019-03-15 02:19:55 +08:00
    @JCZ2MkKb5S8ZX9pq #38
    1. 这个我晓得,但那一般用来搞笑的吧~
    2. 你的 ID 和我 ID 有得一拼。。我是有规则的,你是乱打的还是?
    noqwerty
        43
    noqwerty  
       2019-03-15 05:22:40 +08:00 via Android
    @xml123 这个大佬的博客在我加到收藏夹之后就再没更新过,太可惜了。
    secsilm
        44
    secsilm  
       2019-03-15 07:45:34 +08:00 via Android
    @JCZ2MkKb5S8ZX9pq 我第一次读你的话就看出来了,而且很不舒服。另外我觉得你这样混淆不利于读者记住正确的字,甚至都分不清你这是故意的(有特殊含义)还是打错字了,也有可能让读者觉得你这个文章水平不行。

    如果在你的使用场景对于这些都无关紧要。当我没说。
    Daming
        45
    Daming  
       2019-03-15 08:11:16 +08:00
    垚(yao)壵(zhuang),这两个字算是比较难分清楚的了
    aREMbosAl
        46
    aREMbosAl  
       2019-03-15 08:30:31 +08:00 via iPhone   ❤️ 1
    @JCZ2MkKb5S8ZX9pq 我写过一个小工具,可以分解分解单字成偏旁部首和笔画,并且带部件结构信息,我想你会产生重复是因为没有结构信息导致。https://github.com/vincentzlt/textprep
    yufei02
        47
    yufei02  
       2019-03-15 08:51:27 +08:00
    在分词领域,有一种解决方法是进行规划,如何你要区别的是"佘"和"余",需要事先人工做个穷举,发音和字形穷举,然后满足相同的分词要求即可。并且把该词标识为规则词。
    yingfengi
        48
    yingfengi  
       2019-03-15 08:54:04 +08:00 via Android
    低配版火星文?
    ioschen
        49
    ioschen  
       2019-03-15 09:21:40 +08:00
    @lastpass 是的,提取汉字拼音,还有多音字这些就是映射,包括不常用的也就那么多。一劳永逸,还可以开源给大家用😄
    ioschen
        50
    ioschen  
       2019-03-15 09:24:04 +08:00
    @lastpass 你这个太少了,不全,比如陈阵就没有
    bghtyu
        51
    bghtyu  
       2019-03-15 09:34:31 +08:00   ❤️ 1
    a632027512
        52
    a632027512  
       2019-03-15 11:54:45 +08:00
    坐等现成的车。 打字输入倒是可以用手写输入。
    chinvo
        53
    chinvo  
       2019-03-15 12:02:22 +08:00 via iPhone
    量化出来的结果不一定符合人识读的感官体验

    拿你举例的 [余] 和 [佘] , [茶] 和 [荼] , [侯] 和 [候],对于认识这些字的人来说,人识读的时候基本能一眼看出差别,对阅读体验还是很不友好的

    不如用异体字和繁体字替代法,因为大部分人不能“看懂”异体字和繁体字,只能“猜测”其含义
    ihciah
        54
    ihciah  
       2019-03-15 12:17:10 +08:00
    一个简单的思路,不一定对:训练一个分类器识别汉字,然后丢进去一个随机干扰后的“余”,那么 TopN 里除掉“余”本身就是和它相似的字了?
    JCZ2MkKb5S8ZX9pq
        55
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-15 12:32:34 +08:00
    @chinvo 繁体因为映射表比较完整,很容易被破解吧。日韩越等异体汉字倒是可以,那块有空也想搞搞。
    Michaelssss
        56
    Michaelssss  
       2019-03-15 12:32:36 +08:00
    首先。。你先得定义什么是“近似”,然后提出量化标准。。
    loading
        57
    loading  
       2019-03-15 12:34:46 +08:00 via Android
    不用,这种字,高中语文老师手里都有……
    JCZ2MkKb5S8ZX9pq
        58
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-15 12:37:08 +08:00
    @vincentzlt 我觉得你这个不错。
    我之前一直觉得,可以用 unicode 这个拼字的特性,做一套自动字体生成的东西。根据横竖笔划密度,自动调整磅数、中宫、转折和尾端处理等等。
    Arnie97
        59
    Arnie97  
       2019-03-15 12:41:38 +08:00 via Android
    单就使用目的而言,这个方法远不如插零宽字符。这不就是故意在文章里制造错别字?而且文章里还不见得有相关的字出现。
    JCZ2MkKb5S8ZX9pq
        60
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-15 12:42:08 +08:00
    @bghtyu 这个不错,看上去接近我的预期。
    JCZ2MkKb5S8ZX9pq
        61
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-03-15 12:43:25 +08:00
    @Arnie97 插零宽字符一个 replace 就全白插了
    hellobanny
        62
    hellobanny  
       2019-03-15 12:47:21 +08:00
    这样错别字满天飞的文章谁要看啊,哪个产品想出来的破主意。
    encro
        63
    encro  
       2019-03-15 12:55:57 +08:00
    结构。将字拆成结构,然后比较结构,然后再比较结构的笔画
    sheeprain0627
        64
    sheeprain0627  
       2019-03-15 13:32:22 +08:00 via Android
    @danielmiao 好思路啊!
    MortyP
        65
    MortyP  
       2019-03-15 14:32:08 +08:00
    有没有人做大家来找茬的插件呀
    neteroster
        66
    neteroster  
       2019-03-15 23:31:50 +08:00 via Android
    galaxyz
        67
    galaxyz  
       2020-08-11 21:16:18 +08:00 via Android
    这是人为造成错别字?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5843 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:54 · PVG 09:54 · LAX 17:54 · JFK 20:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.