java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊! ...

打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

拼写纠正系列

NLP 中文拼写检测实现思路
NLP 中文拼写检测纠正算法整理
NLP 英文拼写算法,假如提拔 100W 倍的性能?
NLP 中文拼写检测纠正 Paper
java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
一个提拔英文单词拼写检测性能 1000 倍的算法?
单词拼写纠正-03-leetcode edit-distance 72.力扣编辑距离
开源项目

nlp-hanzi-similar 汉字相似度
word-checker 拼写检测
sensitive-word 敏感词
简单的需求

临近放工,小明忙完了本日的任务,正准备放工回家。
一条消息闪烁了起来。
“最近发现公众号的拼写检查功能不错,帮助用户发现错别字,体验不错。给我们系统也做一个。”
看着这条消息,小明在内心默默问候了一句。
“我 TND 的会做这个,就直接去人家总部上班了,在这受你的气。”
“好的”,小明回复到,“我先看看”
本日,天王老子来了我也得放工,耶稣也留不住。

小明想着,就回家了。
岑寂分析

说到这个拼写检查,小明其实是知道的。
自己没吃过猪肉,还是见过猪跑的。
平时看过一些公众号大佬分享,说是公众号推出了拼写检查功能,以后再也不会有错别字了。
厥后,小明还是在他们的文章中看到了不少错别字。厥后,就没有厥后了。
为什么不去问一问万能的 github 呢?
小明打开了 github 发现好像没有成熟的 java 相关的开源项目,有的几颗星,用起来不太放心。
估计 NLP 是搞 python 的比较多吧,java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
小明默默地点起了一根华子……
窗外的夜色如水,不禁陷入了沉思,我来自何方?去往何处?人生的意义又是什么?

尚有余热的烟灰落在了小明某东买的拖鞋上,把他脑海中脱缰的野马烫的一机灵。
没有任何思路,没有任何头绪,还是先洗洗睡吧。
那一夜,小明做了一个长长的好梦。梦里没有任何的错别字,所有的字句都坐落在正确的位置上……
转机

第二天,小明打开了搜索框,输入 spelling correct。
可喜的是,找到了一篇英文拼写纠正算法解说。
吾尝终日而思矣,不如须臾之所学也。小明叹了一句,就看了起来。
算法思路

英文单词紧张有 26 个英笔墨母组成,所以拼写的时间大概出现错误。
首先可以获取正确的英文单词,节选如下:
  1. apple,16192
  2. applecart,41
  3. applecarts,1
  4. appledrain,1
  5. appledrains,1
  6. applejack,571
  7. applejacks,4
  8. appleringie,1
  9. appleringies,1
  10. apples,5914
  11. applesauce,378
  12. applesauces,1
  13. applet,2
复制代码
每一行用逗号分隔,后面是这个单词出现的频率。
以用户输入 appl 的为例,假如这个单词不存在,则可以对其举行 insert/delete/replace 等操作,找到最靠近的单词。(本质上就是找到编辑距离最小的单词)
假如输入的单词存在,则阐明正确,不消处置惩罚。

词库的获取

那么英文词库去那里得到呢?
小明想了想,于是去各个地方查了一圈,最后找到了一个比较完善的英文单词频率词库,共计 27W+ 的单词。
节选如下:
  1. aa,1831
  2. aah,45774
  3. aahed,1
  4. aahing,30
  5. aahs,23
  6. ...
  7. zythums,1
  8. zyzzyva,2
  9. zyzzyvas,1
  10. zzz,76
  11. zzzs,2
复制代码
焦点代码

获取用户当前输入的所有大概情况,焦点代码如下:
[code]/** * 构建出当前单词的所有大概错误情况 * * @param word 输入单词 * @return 返回效果 * @since 0.0.1 * @author 老马啸西风 */private List edits(String word) {    List result = new LinkedList();    for (int i = 0; i < word.length(); ++i) {        result.add(word.substring(0, i) + word.substring(i + 1));    }    for (int i = 0; i < word.length() - 1; ++i) {        result.add(word.substring(0, i) + word.substring(i + 1, i + 2) + word.substring(i, i + 1) + word.substring(i + 2));    }    for (int i = 0; i < word.length(); ++i) {        for (char c = 'a'; c

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表