• 请不要在回答技术问题时复制粘贴 AI 生成的内容
JCZ2MkKb5S8ZX9pq
V2EX  ›  程序员

怎么找出近似的汉字?

  •  2
     
  •   JCZ2MkKb5S8ZX9pq · Mar 14, 2019 · 8980 views
    This topic created in 2791 days ago, the information mentioned may be changed or developed.
    • 想找出笔划差别细微的汉字。
    • 比如 [余] 和 [佘] , [茶] 和 [荼] 。
    • 一种思路是在给定字体下,渲染成固定尺寸的图片,然后 bitmap 比较汉明距离。
    • 但这样碰到偏旁缩放的字可能会误判,比如 [侯] 和 [候] 。
    • python 下有啥现成的轮子嘛?
    • 或者大家还有啥别的思路嘛?
    Supplement 1  ·  Mar 14, 2019

    补充说明:

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

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

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

    黑色占比 0.13484312996031747


    黑色占比 0.16272941468253968


    差别比例 0.48925163811932404

    =====

    进展汇报

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

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

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

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

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