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

怎么找出近似的汉字?

  •  2
     
  •   JCZ2MkKb5S8ZX9pq · 12 天前 · 3995 次点击
    • 想找出笔划差别细微的汉字。
    • 比如 [余] 和 [佘] , [茶] 和 [荼] 。
    • 一种思路是在给定字体下,渲染成固定尺寸的图片,然后 bitmap 比较汉明距离。
    • 但这样碰到偏旁缩放的字可能会误判,比如 [侯] 和 [候] 。
    • python 下有啥现成的轮子嘛?
    • 或者大家还有啥别的思路嘛?
    第 1 条附言  ·  12 天前

    补充说明:

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

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

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

    黑色占比 0.13484312996031747


    黑色占比 0.16272941468253968


    差别比例 0.48925163811932404

    =====

    进展汇报

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

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

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

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

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