怎么找出近似的汉字? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
JCZ2MkKb5S8ZX9pq
V2EX    程序员

怎么找出近似的汉字?

  •  2
     
  •   JCZ2MkKb5S8ZX9pq 2019-03-14 17:16:17 +08:00 7724 次点击
    这是一个创建于 2411 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 想找出笔划差别细微的汉字。
    • 比如 [余] 和 [佘] , [茶] 和 [荼] 。
    • 一种思路是在给定字体下,渲染成固定尺寸的图片,然后 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 大字库了,比如微软雅黑 /思源 /萍方的交集,差不多这个范围里找。
    laspass
        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     Solana     1404 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 16:39 PVG 00:39 LAX 09:39 JFK 12:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86