码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • nlp入门(三)基于贝叶斯算法的拼写错误检测器


    合集 - nlp入门(5)
    1.nlp入门(二) :商品信息可视化与文本分析实战08-082.nlp入门(一) :nlp常用工具包实战07-31
    3.nlp入门(三)基于贝叶斯算法的拼写错误检测器08-09
    4.nlp入门(四)新闻分类实验08-105.nlp入门(五)隐马尔科夫模型08-15
    收起

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

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

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

    一、数据预处理

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    七、纠正拼写错误的单词

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

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

    八、测试结果

    print(correct('appl'))
    print(correct('appla'))
    print(correct('learw'))
    print(correct('tess'))
    print(correct('morw'))

     

  • 相关阅读:
    【升职加薪秘籍】我在服务监控方面的实践(1)-监控蓝图
    如何批量一键下单寄快递
    Int64针对32位架构是按照4字节还是8字节对齐?
    全链路压测基础
    猿创征文 | 基于H5实现跨文档通信 & websocket
    国风频频出圈!品牌如何借势发力?小红书数据查询3招玩转国风
    互联网摸鱼日报(2022-12-03)
    【2023集创赛】加速科技杯作品:高光响应的二硫化铼光电探测器
    COPU陆首群教授应邀在ApacheCon Asia会议上致辞
    mac 通过SQLiteStudio来实时可视化查看Android Studio内的SQLite数据库
  • 原文地址:https://www.cnblogs.com/zhangshihang/p/17615999.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号