V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
faywong8888
V2EX  ›  输入法

如何实现一个拼音拼写纠错算法?

  •  1
     
  •   faywong8888 · 14 天前 · 1192 次点击

    要求

    如常见智能拼音输入法,用户输入的拼写有简拼( zfb 、wx )、局部简拼( zhongguor )、全拼( nihao ),其中会有各种拼写错误(微位替换,w->a/s/d/e/q ,少字符,多字符,临近字符对调,整体转置 wang -> angw 等),请问要开发一个纠错算法把错误拼写纠回正确拼写,应该如何去设计,需要使用哪些数据结构/算法?

    背景

    自己是 Rime 重度用户,想为 Rime 输入法增加纠错模块。同时也想开一贴和众多 v 友研究下这个细分的领域技术。集思广益,启发彼此。开源输入法基本上纠错这块都做得不好。

    10 条回复    2025-03-26 23:56:31 +08:00
    faywong8888
        1
    faywong8888  
    OP
       14 天前
    微位替换 ->键位替换
    yyf1234
        2
    yyf1234  
       14 天前 via iPhone
    算法叫 编辑距离
    katwalk
        3
    katwalk  
       14 天前
    对对对,经常输错相邻的拼音,期待楼主能找到解决的办法 🤗
    hhhhhh123
        4
    hhhhhh123  
       14 天前
    @katwalk #3 现在的输入都有纠错功能。
    xzpjerry731
        5
    xzpjerry731  
       14 天前 via iPhone
    补全还是纠错?
    lesterchen
        6
    lesterchen  
       14 天前
    我现在用键盘打字最常见的错误情况是.拼音的字母顺序错了~
    jarry777
        7
    jarry777  
       14 天前 via iPhone
    迫切需要双拼纠错。
    目前在用 gboard ,符号显示不全的 bug 得两年了吧都没人修
    hwdq0012
        8
    hwdq0012  
       14 天前
    vim spell 不知道怎么弄的,想想,好像是你自己维护一个字典,然后拼写的在字典里很像但不是的,就会有提示,按快捷键类似代码那样补全,就纠正了

    ]s 跳到下一个拼写问题的位置
    [s 跳到上一个拼写问题的位置
    z=选择正确拼写
    zg 添加用户拼写
    zw 删除用户拼写
    :set spell 启用拼写
    :set nospell

    自己做的话我会用 myers 算法(git diff 算法好像也是这样),可以对比字典里的词语和正文的词语相似度
    不过好像正文还需要分词一下,应该也有什么现成的中文分词工具吧
    katwalk
        9
    katwalk  
       13 天前
    @hhhhhh123 #4 太弱了,我用的搜狗。
    shot
        10
    shot  
       3 天前
    Rime 处理这个问题的标准答案是使用「模糊音」。

    speller/algebra/+:
    - derive/^([zcs])h/$1/ # z, c, s => zh, ch, sh
    - derive/^([zcs])([^h])/$1h$2/ # zh, ch, sh => z, c, s
    - derive/([aeio])n$/$1ng/ # ang, eng, ing, ong => an, en, in, on
    - derive/([aeio])ng$/$1n/ # an, en, in, on => ang, eng, ing, ong
    - derive/([iu])a(o|ng?)$/a$1$2/ # tain => tian

    ---------
    启用模糊音会带来两个问题:
    1. 候选词数目会大量增加。如“zhangk”会候选「展开」,不过我还没有体感到候选条目增加引起的性能卡顿;
    2. 增加的候选词可能会带来预料之外的词频排序。还是“zhangk”,我机器上「展开」会排在「掌控」前面。

    因为我用的是全拼,所以写了一个根据输入编码和候选词拼音匹配程度重新排序的插件,也算处理掉这个问题了。
    https://github.com/HuangJian/rime-frost/blob/hj/js/sort_by_pinyin.js
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:13 · PVG 00:13 · LAX 09:13 · JFK 12:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.