经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 大数据/云/AI » 人工智能基础 » 查看文章
nlp入门(三)基于贝叶斯算法的拼写错误检测器
来源:cnblogs  作者:过客匆匆,沉沉浮浮  时间:2023/8/9 9:27:13  对本文有异议

源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com)

数据来源:norvig.com/big.txt

贝叶斯原理可看这里:机器学习算法学习笔记 - 过客匆匆,沉沉浮浮 - 博客园 (cnblogs.com)

一、数据预处理

将输入的数据全部变为小写方便后续处理

  1. def words(text):
  2. return re.findall('[a-z]+', text.lower())

二、根据语料库统计不同单词出现的词频

单词字典每个单词词频默认为1,因为如果单词字典默认值为为0,那么出现了语料库中没有的单词,就会默认概率为0,导致新的单词无法被识别

  1. def train(features):
  2. model = collections.defaultdict(lambda: 1) # 如果默认为0则出现语料库中没有的新词会不识别,所以默认为1
  3. for f in features:
  4. model[f] += 1
  5. return model

三、打开语料库与构建字母表

  1. NWORDS = train(words(open('data/big.txt').read()))
  2. alphabet = 'abcdefghijklmnopqrstuvwxyz'

四、返回编辑距离为1的单词

单词a经过n次修改可以得到新的单词b,那我们叫b为a的编辑距离为1的单词,下面函数就返回编辑距离为1的单词

  1. # 返回编辑距离为1的单词
  2. def editsl(word):
  3. n = len(word)
  4. return set([word[0:i] + word[i + 1:] for i in range(n)] + # 字母打多了一个
  5. [word[0:i] + word[i + 1] + word[i] + word[i + 2:] for i in range(n - 1)] + # 字母打反了一个
  6. [word[0:i] + c + word[i + 1:] for i in range(n) for c in alphabet] + # 字母打错了一个
  7. [word[0:i] + c + word[i:] for i in range(n + 1) for c in alphabet]) # 字母打少了一个

五、返回编辑距离为2的单词

  1. # 考虑编辑距离为2的单词
  2. def known_edits2(word):
  3. return set(e2 for e1 in editsl(word) for e2 in editsl(e1) if e2 in NWORDS)

六、判断单词是否在语料库中

  1. def known(words):
  2. return set(w for w in words if w in NWORDS)

七、纠正拼写错误的单词

优先考虑原单词a是否在语料库中,如果存在就返回原单词,不存在就考虑编辑距离为1的单词,返回使用频率最高的那个如果编辑距离为1的单词也不在语料库中,那么就考虑编辑距离为2的单词,同样,如果编辑距离为2的单词都不在语料库中,那么这可能是一个新的单词,直接返回单词本身

  1. def correct(word):
  2. candidates = known([word]) or known(editsl(word)) or known_edits2(word) or [word]
  3. return max(candidates, key=lambda w: NWORDS[w])

八、测试结果

  1. print(correct('appl'))
  2. print(correct('appla'))
  3. print(correct('learw'))
  4. print(correct('tess'))
  5. print(correct('morw'))

 

原文链接:https://www.cnblogs.com/zhangshihang/p/17615999.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号