CURD 写多了,曾对以下几个问题思虑不解,见缘回答。
随便谈谈,问题较多,不需要具体结果,只谈大概思维逻辑。
常见操作系统、包括某些 IDE 、文本编辑器都对英文语法、甚至中文语法进行检查,可它内部是如何判断一个单词或者短语的语法是否正确?
举几个例子
我不懂英文的逻辑,这里不考虑动词名词的结尾改法,因为我不太相信编辑器是把所有词分类后进行处理的? 这工作量太大了。我觉得应该是别的语义相关的吧?
上述有几个词,其中 "xign" 有的人一眼就能识别出这个不是英语,问他为什么?他却没有原因。 同理,编辑器又是如何判断出来的?
这个常见于一些操作系统自带的软件,包括 Chrome 地址栏、编辑器、记事本等。
当你输入完整的一段内容,比如中文的:“保持对陌生人的友善。用知识去帮助别人。” 若在 Chrome 地址栏输入上述内容,再多次慢慢按 CTRL + BACK SAPCE 那么他会逐个删除所有词组,直至为空。
这个是怎么做到的?是软件内部自己写的还是操作系统自带的分词?类似 ES 的中文分词原理?
如果自己写一个 win 桌面软件,用系统自带的编辑器控件、富文本编辑器控件,其中是不附带这部分功能的,要如何实现?
26 键的就不说了,只说九宫格的输入方式。 比如汉字拼音九宫格的 9426 486 可以组合出很多的可能。 输入法会给你很多的待选项:
感觉就是它根据 声母+韵母 把所有的可能性给你列出来了,这个难做吗?
因为日语九宫格的输入,一个键虽然隐藏着 5 个字母。联想上文的输入,但它并不会把所有可能性给你列出来。
根据键位的方向滑动选择其中一个音,那么可能性和结果就确定为一个了,这个几乎等同于 26 键位。
目前为止没有一个日语输入法可以实现类似汉语拼音的输入法那样,做成那样难吗?自己拿开源项目魔改难吗?
还有个疑问就是,所有 拼音或者假名 对应的汉字都以字典形式在程序里吗?还是有更好的实现方式?
1
thinkershare 2023-01-15 23:30:47 +08:00
没啥魔法,就是分词后暴力匹配,然后最多添加一些模糊匹配(不考虑语义)。现在基于 DL 的语义分析是个黑箱,谁也不知道为什么是最终那个结果。
|
2
ellermister OP @thinkershare 你是说第一个语法检查还是第二个分词的问题。
|
3
shortmund 2023-01-15 23:34:41 +08:00
建议题主了解一下 NLP 领域中的 “语言模型”,应该能回答前两个问题:简单说就是从大量语料中可以学习出一个模型,这个模型可以判断出一个词在语言中出现概率的大小。
|
4
cowcomic 2023-01-15 23:39:46 +08:00 4
第一个实际就是字典,只不过可以用很高效的查找型字典,比如双 Trie 树之类的
第二个应该是 chrome 的分词功能,分词干的事情都差不多,不管是 ES 里面的分词还是 chrome 的分词,但技术原理会有一定差异,比如有些是字典加状态机,有些是字典加 HMM ,有些是纯深度学习。对分词有兴趣可以去看看斯坦福的 coreNLP ,hanLP ,结巴分词,有很多介绍他们原理的文章 上面这些都涉及到 NLP 相关的算法,对这方面感兴趣可以找一些 NLP 相关的算法看看 |
5
cpstar 2023-01-15 23:40:04 +08:00
字母语言不存在分词,空格就完成了分词,但是存在词组,然而词组也是相对可固定的,但这已经到了语义程度了。语法检查那不就简单了,知道单词知道变形方案(甚至把变形方案也变成一个单词),完活。
中文的分词,就是依赖词库,所有的中文搜索引擎第一步就是首先分词,一般词汇好说,遇到姓氏会麻烦一些。 拼音的排列组合是固定的,我记得当初有输入法在全键盘模式,按下第一个字母就会灰掉不可能的字母。 总体一句话,穷举。 |
6
ellermister OP @cpstar 你的这个我想过,把所有的单词组合的可能放一起, 但这样会不会导致安装包很大,我印象比较小的程序也能够做到? 只是暂时想不起来了例子。
|
7
ellermister OP @shortmund 好,谢谢,这是我的盲区了,头疼。哈哈
|
8
ellermister OP |
9
Aloento 2023-01-15 23:50:49 +08:00
中文分词:GitHub 搜索 结巴
中文语法检查基本就算了 |
10
est 2023-01-15 23:55:36 +08:00
> 再多次慢慢按 CTRL + BACK SAPCE 那么他会逐个删除所有词组,直至为空。这个是怎么做到的?是软件内部自己写的还是操作系统自带的分词?
这个是 IBM ICU 库的分词效果。。 https://www.v2ex.com/t/854748 |
11
ellermister OP @Aloento 好的,star 了,回头可以用起来。
|
12
mxT52CRuqR6o5 2023-01-15 23:56:44 +08:00 via Android
问题一是你想太复杂了,就直接匹配就是了,运算量其实还好,因为可以把词典做成树搜索
|
13
ellermister OP @est 厉害,这个也很强大。哈哈,前端都可以轻松分词了。
|
14
b1ghawk 2023-01-16 01:11:35 +08:00 via Android
我爱你🤡🤡🤡🤡🤡🤡
|
15
t0iletb0mber 2023-01-16 09:44:52 +08:00
最近在看吴军的<<数学之美>>,应该可以解答这些问题
|
16
NoOneNoBody 2023-01-16 10:26:01 +08:00
这是个很认真的人,问个问题都协程格式十分整齐的文档,服
|
17
NoOneNoBody 2023-01-16 10:26:45 +08:00
@NoOneNoBody
协程-->写成 |
18
Chinsung 2023-01-16 11:52:49 +08:00
这种你测试下边界就行,第一个就是语法检查器内置了常用英文单词,然后根据空格或者驼峰分词,KMP ,AC 自动机之类的算法匹配一下,匹配不到就告警
第二个,我看没有网络请求分词,google 应该是预置了一个常用分词到 js 里,然后 js 实现下分词的算法,为什么说是预置的,因为你打个哈士奇、科比,他就是一个一个字删除的 第三个,日文输入方式不太了解,但是本质上这种就是状态机和匹配,我猜测是因为中文输入习惯问题,比如 nh=你好,这也是种中文输入方式,但是日文看五十音图的逻辑,本质大部分时候其实在输入英文,当然需要比较准确的定位每个字母 |
20
Cola98 2023-01-16 16:18:22 +08:00
第一个应该是静态检查,和语法分析器有关系,第二个涉及到分词,具体的其他大佬已经解答了((
|
21
icatme 2023-01-17 12:47:53 +08:00 via Android
第一个问题,看你描述应该是拼写检查,word 的检查就需要有相应的字典,而且早期版本显示有顺序。
|