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

提问一个关于自己不了解的编程领域问题?语言相关,输入法,分词,语法检查

  •  
  •   ellermister · 2023-01-15 23:26:05 +08:00 · 1626 次点击
    这是一个创建于 456 天前的主题,其中的信息可能已经有所发展或是发生改变。

    CURD 写多了,曾对以下几个问题思虑不解,见缘回答。

    随便谈谈,问题较多,不需要具体结果,只谈大概思维逻辑。

    1. 语法检查

    常见操作系统、包括某些 IDE 、文本编辑器都对英文语法、甚至中文语法进行检查,可它内部是如何判断一个单词或者短语的语法是否正确?

    举几个例子

    example

    我不懂英文的逻辑,这里不考虑动词名词的结尾改法,因为我不太相信编辑器是把所有词分类后进行处理的? 这工作量太大了。我觉得应该是别的语义相关的吧?

    上述有几个词,其中 "xign" 有的人一眼就能识别出这个不是英语,问他为什么?他却没有原因。 同理,编辑器又是如何判断出来的?

    2. 分词

    这个常见于一些操作系统自带的软件,包括 Chrome 地址栏、编辑器、记事本等。

    当你输入完整的一段内容,比如中文的:“保持对陌生人的友善。用知识去帮助别人。” 若在 Chrome 地址栏输入上述内容,再多次慢慢按 CTRL + BACK SAPCE 那么他会逐个删除所有词组,直至为空。

    这个是怎么做到的?是软件内部自己写的还是操作系统自带的分词?类似 ES 的中文分词原理?

    如果自己写一个 win 桌面软件,用系统自带的编辑器控件、富文本编辑器控件,其中是不附带这部分功能的,要如何实现?

    split word

    3. 手机输入法

    26 键的就不说了,只说九宫格的输入方式。 比如汉字拼音九宫格的 9426 486 可以组合出很多的可能。 输入法会给你很多的待选项:

    • xiao guo
    • xiang to
    • zhang to
    • xian huo/
    • xiao guo/gun/hun/huo/gu....
    • ...
    • zi ao hun ....

    感觉就是它根据 声母+韵母 把所有的可能性给你列出来了,这个难做吗?

    因为日语九宫格的输入,一个键虽然隐藏着 5 个字母。联想上文的输入,但它并不会把所有可能性给你列出来。

    根据键位的方向滑动选择其中一个音,那么可能性和结果就确定为一个了,这个几乎等同于 26 键位。

    目前为止没有一个日语输入法可以实现类似汉语拼音的输入法那样,做成那样难吗?自己拿开源项目魔改难吗?

    还有个疑问就是,所有 拼音或者假名 对应的汉字都以字典形式在程序里吗?还是有更好的实现方式?

    ja-input

    zh-input

    21 条回复    2023-01-17 12:47:53 +08:00
    thinkershare
        1
    thinkershare  
       2023-01-15 23:30:47 +08:00
    没啥魔法,就是分词后暴力匹配,然后最多添加一些模糊匹配(不考虑语义)。现在基于 DL 的语义分析是个黑箱,谁也不知道为什么是最终那个结果。
    ellermister
        2
    ellermister  
    OP
       2023-01-15 23:32:03 +08:00
    @thinkershare 你是说第一个语法检查还是第二个分词的问题。
    shortmund
        3
    shortmund  
       2023-01-15 23:34:41 +08:00
    建议题主了解一下 NLP 领域中的 “语言模型”,应该能回答前两个问题:简单说就是从大量语料中可以学习出一个模型,这个模型可以判断出一个词在语言中出现概率的大小。
    cowcomic
        4
    cowcomic  
       2023-01-15 23:39:46 +08:00   ❤️ 4
    第一个实际就是字典,只不过可以用很高效的查找型字典,比如双 Trie 树之类的

    第二个应该是 chrome 的分词功能,分词干的事情都差不多,不管是 ES 里面的分词还是 chrome 的分词,但技术原理会有一定差异,比如有些是字典加状态机,有些是字典加 HMM ,有些是纯深度学习。对分词有兴趣可以去看看斯坦福的 coreNLP ,hanLP ,结巴分词,有很多介绍他们原理的文章

    上面这些都涉及到 NLP 相关的算法,对这方面感兴趣可以找一些 NLP 相关的算法看看
    cpstar
        5
    cpstar  
       2023-01-15 23:40:04 +08:00
    字母语言不存在分词,空格就完成了分词,但是存在词组,然而词组也是相对可固定的,但这已经到了语义程度了。语法检查那不就简单了,知道单词知道变形方案(甚至把变形方案也变成一个单词),完活。

    中文的分词,就是依赖词库,所有的中文搜索引擎第一步就是首先分词,一般词汇好说,遇到姓氏会麻烦一些。

    拼音的排列组合是固定的,我记得当初有输入法在全键盘模式,按下第一个字母就会灰掉不可能的字母。

    总体一句话,穷举。
    ellermister
        6
    ellermister  
    OP
       2023-01-15 23:44:02 +08:00
    @cpstar 你的这个我想过,把所有的单词组合的可能放一起, 但这样会不会导致安装包很大,我印象比较小的程序也能够做到? 只是暂时想不起来了例子。
    ellermister
        7
    ellermister  
    OP
       2023-01-15 23:44:22 +08:00
    @shortmund 好,谢谢,这是我的盲区了,头疼。哈哈
    ellermister
        8
    ellermister  
    OP
       2023-01-15 23:50:24 +08:00
    @cowcomic 谢谢了解了,你们所说的纯深度学习或者语义分析是在近些年才有的?那之前是怎么实现的,当然我印象记不住之前到底有没有。

    大概就是说只有语义分析相关的语言模型的实现,这一种解决之路吧?
    Aloento
        9
    Aloento  
       2023-01-15 23:50:49 +08:00
    中文分词:GitHub 搜索 结巴
    中文语法检查基本就算了
    est
        10
    est  
       2023-01-15 23:55:36 +08:00
    > 再多次慢慢按 CTRL + BACK SAPCE 那么他会逐个删除所有词组,直至为空。这个是怎么做到的?是软件内部自己写的还是操作系统自带的分词?


    这个是 IBM ICU 库的分词效果。。

    https://www.v2ex.com/t/854748
    ellermister
        11
    ellermister  
    OP
       2023-01-15 23:56:09 +08:00
    @Aloento 好的,star 了,回头可以用起来。
    mxT52CRuqR6o5
        12
    mxT52CRuqR6o5  
       2023-01-15 23:56:44 +08:00 via Android
    问题一是你想太复杂了,就直接匹配就是了,运算量其实还好,因为可以把词典做成树搜索
    ellermister
        13
    ellermister  
    OP
       2023-01-15 23:58:56 +08:00
    @est 厉害,这个也很强大。哈哈,前端都可以轻松分词了。
    b1ghawk
        14
    b1ghawk  
       2023-01-16 01:11:35 +08:00 via Android
    我爱你🤡🤡🤡🤡🤡🤡
    t0iletb0mber
        15
    t0iletb0mber  
       2023-01-16 09:44:52 +08:00
    最近在看吴军的<<数学之美>>,应该可以解答这些问题
    NoOneNoBody
        16
    NoOneNoBody  
       2023-01-16 10:26:01 +08:00
    这是个很认真的人,问个问题都协程格式十分整齐的文档,服
    NoOneNoBody
        17
    NoOneNoBody  
       2023-01-16 10:26:45 +08:00
    @NoOneNoBody
    协程-->写成
    Chinsung
        18
    Chinsung  
       2023-01-16 11:52:49 +08:00
    这种你测试下边界就行,第一个就是语法检查器内置了常用英文单词,然后根据空格或者驼峰分词,KMP ,AC 自动机之类的算法匹配一下,匹配不到就告警
    第二个,我看没有网络请求分词,google 应该是预置了一个常用分词到 js 里,然后 js 实现下分词的算法,为什么说是预置的,因为你打个哈士奇、科比,他就是一个一个字删除的
    第三个,日文输入方式不太了解,但是本质上这种就是状态机和匹配,我猜测是因为中文输入习惯问题,比如 nh=你好,这也是种中文输入方式,但是日文看五十音图的逻辑,本质大部分时候其实在输入英文,当然需要比较准确的定位每个字母
    Chinsung
        19
    Chinsung  
       2023-01-16 11:53:21 +08:00
    @Chinsung #18 第一个你可以用生僻单词试一下,大部分都是内置一定词的
    Cola98
        20
    Cola98  
       2023-01-16 16:18:22 +08:00
    第一个应该是静态检查,和语法分析器有关系,第二个涉及到分词,具体的其他大佬已经解答了((
    icatme
        21
    icatme  
       2023-01-17 12:47:53 +08:00 via Android
    第一个问题,看你描述应该是拼写检查,word 的检查就需要有相应的字典,而且早期版本显示有顺序。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4272 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:26 · PVG 13:26 · LAX 22:26 · JFK 01:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.