拼写检查应用程序:基于词典编辑的解释

news2025/3/11 7:11:31

一、说明

        拼写检查器项目涉及创建一个可以自动检测并纠正给定文本中的拼写错误的程序。此类项目在各种应用程序中非常有用,例如文字处理器、电子邮件客户端和网络浏览器,可确保用户生成的文本没有拼写错误。

        您可以找到我创建的拼写检查器应用程序: https: //spellchecker-xr26zeryecn4cugmwrvgje.streamlit.app/

二、拼写检查应用程序创建方法:

        可以使用多种方法创建拼写检查器应用程序:

  1. 基于字典的算法:
  • 基于查找:该算法使用预先构建的正确单词词典。它会根据字典检查输入文本中的每个单词,并针对未找到的单词提出更正建议。
  • 编辑距离:该算法计算将一个单词转换为另一个单词所需的编辑(插入、删除、替换)次数。然后根据编辑距离最小的单词提出建议。在这篇文章中,我们将详细讨论这个主题。

2. N-gram 模型: N-gram 是相邻单词或字母的序列。N-gram 模型使用特定单词序列一起出现的可能性的统计分析。建议基于相邻单词组合的概率。

3. 概率方法:

  • 贝叶斯方法:这些方法使用贝叶斯概率来估计句子中某个单词在给定上下文的情况下正确的可能性
  • 上下文信息:拼写检查器可以考虑单词的周围上下文来改进纠正建议。例如,一个单词的正确拼写可能取决于它周围的单词。

4. 机器学习方法:

  • 监督学习:使用正确和错误拼写的标记数据集,可以训练机器学习算法来预测拼写错误单词的更正。
  • 神经网络:深度学习模型,例如循环神经网络 (RNN) 或 Transformer,可用于拼写检查任务。这些模型可以捕获语言中的复杂模式和依赖性。

5. 基于规则的系统:

  • 形态分析:分析单词的结构并应用语言规则来生成建议。这对于具有复杂形态的语言特别有用。
  • 基于语法的方法:根据语法规则检查输入文本,以识别并纠正潜在的拼写错误。

6. 混合方法:将多种技术(例如基于字典的方法与机器学习模型)相结合,以提高拼写检查的准确性和覆盖范围。

三、拼写检查器中的错误检查指标

        A. 非单词错误 :当单词拼写错误或形成不正确时,就会发生非单词错误,从而导致字母序列与任何有效单词都不对应。

        B. 真实单词错误:另一方面,真实单词错误涉及将一个单词转换为另一个有效单词的拼写错误,从而可能改变其含义。

        在今天的课程中,我们将研究基于字典的编辑距离算法。

        在接下来的文章中,我们将详细介绍更多算法。

1.小写和标记化

# Function to tokenize words
def words(document):
    "Convert text to lower case and tokenize the document"
    return re.findall(r'\w+', document.lower())

        此函数将 big.txt 文档作为输入,将文本转换为小写,并将文档标记为单词列表。它使用正则表达式r'\w+'查找文档中的所有单词字符(字母、数字和下划线)序列。

2.读取文档中的每个单词,传入word函数,统计每个单词的个数

all_words = Counter(words(open('big.txt').read()))

打开名为“big.txt”的文件并读取其内容。然后对文本文件中的每个单词调用words(document)函数。

Counter一个 Python 类,用于计算集合中元素的出现次数。在本例中,它获取 生成的单词列表words(document)并创建一个类似字典的对象,其中键是唯一单词,值是文档中每个单词的计数。

例如:

all_words=Counter({'the': 79809, 'of': 40024, 'and': 38312, 'to': 28765, 'in': 22023, 'a': 21124.....})

3.生成与输入单词相距一次编辑的所有可能单词

我。splits:创建单词所有可能拆分的列表。

splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]

单词“THANKSGIPNG”的示例:

word='THANKSGIPNG'
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
splits
[('', 'THANKSGIPNG'),
 ('T', 'HANKSGIPNG'),
 ('TH', 'ANKSGIPNG'),
 ('THA', 'NKSGIPNG'),
 ('THAN', 'KSGIPNG'),
 ('THANK', 'SGIPNG'),
 ('THANKS', 'GIPNG'),
 ('THANKSG', 'IPNG'),
 ('THANKSGI', 'PNG'),
 ('THANKSGIP', 'NG'),
 ('THANKSGIPN', 'G'),
 ('THANKSGIPNG', '')]

A. 删除:C通过从原始单词中删除一个字符来创建拆分内的单词列表。

deletes = [left + right[1:] for left, right in splits if right]

对于上面的例子:

deletes = [left + right[1:] for left, right in splits if right]
deletes
['HANKSGIPNG',
 'TANKSGIPNG',
 'THNKSGIPNG',
 'THAKSGIPNG',
 'THANSGIPNG',
 'THANKGIPNG',
 'THANKSIPNG',
 'THANKSGPNG',
 'THANKSGING',
 'THANKSGIPG',
 'THANKSGIPN']

B. 插入:通过在原始单词中每个可能的位置插入每个字母,从拆分列表中创建单词列表。

inserts = [left + c + right for left, right in splits for c in alphabets]
['aTHANKSGIPNG', 'bTHANKSGIPNG', 'cTHANKSGIPNG', 'dTHANKSGIPNG', 'eTHANKSGIPNG', 'fTHANKSGIPNG', 'gTHANKSGIPNG', 'hTHANKSGIPNG', .....]

C. 替换:通过用每个字母替换拆分列表单词中的每个字符来创建单词列表。

replaces = [left + c + right[1:] for left, right in splits if right for c in alphabets]
['aHANKSGIPNG',
 'bHANKSGIPNG',
 'cHANKSGIPNG',
 'dHANKSGIPNG',
 'eHANKSGIPNG',
 'fHANKSGIPNG',
 'gHANKSGIPNG',
 'hHANKSGIPNG',
 'iHANKSGIPNG',
 'jHANKSGIPNG',
 'kHANKSGIPNG',
 'lHANKSGIPNG',
 'mHANKSGIPNG',...
..........
..........
..........
'THANKSGIPNv',
 'THANKSGIPNw',
 'THANKSGIPNx',
 'THANKSGIPNy',
 'THANKSGIPNz']]

D. transposes:此行通过转置(交换)分割列表单词中的相邻字符来创建单词列表。

transposes = [left + right[1] + right[0] + right[2:] for left, right in splits if len(right) > 1]
['HTANKSGIPNG',
 'TAHNKSGIPNG',
 'THNAKSGIPNG',
 'THAKNSGIPNG',
 'THANSKGIPNG',
 'THANKGSIPNG',
 'THANKSIGPNG',
 'THANKSGPING',
 'THANKSGINPG',
 'THANKSGIPGN']

二. 合并删除、插入、替换和传输以获得所有可能的单词

合并完成后,我们需要获取该集合,因为我们不希望重复任何单词。

set(deletes + inserts + replaces + transposes)

因此我们的最终函数是:

def edits_one(word):
    "Create all edits that are one edit away from `word`."
    alphabets = 'abcdefghijklmnopqrstuvwxyz'
    splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    deletes = [left + right[1:] for left, right in splits if right]
    inserts = [left + c + right for left, right in splits for c in alphabets]
    replaces = [left + c + right[1:] for left, right in splits if right for c in alphabets]
    transposes = [left + right[1] + right[0] + right[2:] for left, right in splits if len(right) > 1]
    return set(deletes + inserts + replaces + transposes)

4.生成距输入单词两次编辑的所有可能编辑

def edits_two(word):
    # Generate all possible edits one edit away from the original word
    one_edit_away = edits_one(word)

    # Generate all possible edits two edits away by applying edits_one to each one-edit-away edit
    two_edits_away = (e2 for e1 in one_edit_away for e2 in edits_one(e1))

    return two_edits_away

        它需要一个单词,找到所有可能的一次编辑修正 ( one_edit_away),然后通过应用到每个一次编辑修正来生成两次编辑修正 ( two_edits_away) 。edits_one

5. 创建一组新的已知单词

        我们获取一组单词 ( words) 并检查每个单词是否出现在全局all_words计数器中。存在的单词all_words被添加到一个名为known_words

def known(words):
    
    known_words = set()
    for word in words:
        if word in all_words:
            known_words.add(word)

    return known_words

6. 检查该单词是否存在于创建的known_words列表、一个编辑列表或两个编辑列表中

        我们创建更正,以检查单词本身是否已知,或者是否存在经过一两次编辑后的已知更正。如果没有找到更正,那么我们将原始单词包含在结果中

def possible_corrections(word):

    corrections = known([word]) or known(edits_one(word)) or known(edits_two(word))
    corrections = corrections or [word]

    return corrections

7. 求给定单词的概率

        我们计算给定单词的概率。我们通过将单词出现的次数(由 计数all_words[word])除以标记总数(N)来做到这一点。

def prob(word, N=sum(all_words.values())): 
    return all_words[word] / N

8. 在可能的校正集中找到最高概率的元素

        更正存储输入单词的一组可能的拼写更正,例如:“THANKSGIPNG”。我们使用该max函数来查找可能的校正集中概率最高的元素。

注意:该key参数指定比较应基于函数计算的概率prob

def spell_check(word):
    corrections = possible_corrections(word)
    most_probable = max(corrections, key=prob)
    
    return "Did you mean {}?".format(most_probable) if most_probable != word else "Correct spelling."
    

        如果最可能的更正与原始单词不同,它会返回一个字符串,使用将该单词format插入most_probable字符串的方法来建议正确的拼写。如果更正与原始单词相同,则返回一个字符串,表明拼写正确。

9. 输入用户的单词并使用单词和拼写检查功能进行分析

        首先,我们使用该函数将用户输入标记为单词列表words。然后,我们使用该函数为输入文本中的每个标记生成拼写建议spell_check

        然后,我们将显示拼写检查结果的降价标题。

        这将显示令牌、其索引以及我们使用 Streamlit 应用程序中的pell_check 获得的建议更正。

def main():
    st.title("Aneesha's Spell Checker App")
    st.text("Happy to have you here!")

    user_input = st.text_area("Enter your text for spell checking:", "")
    
    if st.button("Check Spelling"):
        tokens = words(user_input)
        suggestions = [spell_check(token) for token in tokens]
        st.markdown("### Spell Check Results:")
        for i, (token, suggestion) in enumerate(zip(tokens, suggestions)):
            st.text(f"{i + 1}. {token}: {suggestion}")

四、后记

        本文首先介绍拼写检查方法,然后简单介绍一些用法。对于工作人员来说,虽然可能不从事具体技术,但是抛砖引玉可以获得启发,再说行业发展趋势还是需要了解的。

检查部署的此应用程序:https://spellchecker-xr26zeryecn4cugmwrvgje.streamlit.app/

欲了解更多此类内容,请订阅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1446579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构哈希表

这里个大家用数组来模拟哈希表 法一&#xff1a;拉链法 法二&#xff1a;开放寻址法 /** Project: 11_哈希表* File Created:Sunday, January 17th 2021, 2:11:23 pm* Author: Bug-Free* Problem:AcWing 840. 模拟散列表 拉链法*/ #include <cstring> #include <iostr…

分享84个jQuery特效,总有一款适合您

分享84个jQuery特效&#xff0c;总有一款适合您 84个jQuery特效下载链接&#xff1a;https://pan.baidu.com/s/1P9fmHWRdaCRMXr3H9sNA1A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理…

鸿蒙系统进一步学习(一):学习资料总结,少走弯路

随着鸿蒙Next的计划越来越近&#xff0c;笔者之前的鸿蒙系统扫盲系列中&#xff0c;有很多朋友给我留言&#xff0c;不同的角度的问了一些问题&#xff0c;我明显感觉到一点&#xff0c;那就是许多人参与鸿蒙开发&#xff0c;但是又不知道从哪里下手&#xff0c;因为资料太多&a…

<网络安全>《28 常用安全标准》

《常用安全标准》 1 个人信息安全 o《信息安全技术 个人信息安全规范》&#xff08;GB/T35273-2017) o《信息安全技术 个人信息去标识化指南》&#xff08;GB/T37964-2019) 2 工业控制安全 o《信息安全技术 工业控制系统安全检查指南》&#xff08;GB/T 37980-2019) o《信息…

STM32 SYSTick高精度延时功能代码实现

文章目录 前言一、SYSTick定时器介绍二、SYSTick定时器和其他定时器的区别三、SYSTick定时器框图讲解四、HAL库中SYSTick配置代码讲解五、SYSTick实现高精度延时总结 前言 本篇文章将给大家讲解一下SYSTICK滴答定时器&#xff0c;以及讲解使用滴答定时器来实现高精度延时功能的…

【51单片机】DS18B20(江科大)

一、DS18B20温度传感器 1.DS18B20介绍 DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点 测温范围 :- 55℃到125℃ 通信接口:1-Wire(单总线) 其它特征:可形成…

复旦TravelPlanner让大语言模型挑战旅程规划

引言&#xff1a;探索语言智能的新疆界——旅行规划 在人工智能的发展历程中&#xff0c;规划一直是核心追求之一。然而&#xff0c;由于缺乏人类水平规划所需的多种认知基础&#xff0c;早期的AI代理主要集中在受限的环境中。随着大语言模型&#xff08;LLMs&#xff09;的出…

[ai笔记5] 个人AI资讯助手实战

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第5篇分享&#xff0c;也是把ai场景化应用的第一篇实操内容&#xff01; 既然要充分学习和了解ai&#xff0c;自然少不了要时常看看ai相关资讯&#xff0c;所以今天特地用字节的“扣子”做了一个ai的资讯…

ChatGPT高效提问—prompt实践

ChatGPT高效提问—prompt实践 ​ 探索prompt在实际生活中的各种应用&#xff0c;旨在帮助理解和掌握如何将之前学到的prompt基础和技巧应用到具体实践中&#xff0c;从而在各个领域实现人工智能的价值。 ​ 通过生动的案例&#xff0c;发现并挖掘ChatGPT和prompt的无穷潜力。…

亚马逊云科技AI应用 SageMaker 新突破,机器学习优势显著

&#xff08;声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区、知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09; Amazon SageMaker是一种机器学习服务&#xff0c;帮助开发人员快速…

《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)

文章目录 7.1 配置和使用 MySQL 监控工具7.1.1 基础知识7.1.2 重点案例&#xff1a;使用 Python 和 Prometheus 监控 MySQL 性能7.1.3 拓展案例 1&#xff1a;自动化 MySQL 慢查询日志分析7.1.4 拓展案例 2&#xff1a;实时警报系统 7.2 解读 MySQL 日志文件7.2.1 基础知识7.2.…

JAVA设计模式之命令模式详解

命令模式 1 命令模式介绍 命令模式(command pattern)的定义: 命令模式将请求&#xff08;命令&#xff09;封装为一个对象&#xff0c;这样可以使用不同的请求参数化其他对象&#xff08;将不同请求依赖注入到其他对象并且能够支持请求&#xff08;命令&#xff09;的排队执行…

Java中的IO介绍

本章内容 一 、File概念 File可以代表一个目录或者一个文件&#xff0c;并不能代表文件的内容 文件和流的区别&#xff1a;File关注的是文件本身的特征&#xff0c;如名称、路径、修改时间、大小。 流关注的是文件的内容。 二、File基本的操作 常见构造方法 | File(String p…

Spring Cloud微服务网关Zuul基础入门使用

一、概述 Zuul是从设备和网络到后端应用程序所有请求的后门&#xff0c;为内部服务提供可配置的对外URL到服务的映射关系&#xff0c;基于JVM的后端路由器。具有一下的功能&#xff1a; 认证与授权压力测试金丝雀测试动态路由负载削减静态相应处理主动流量管理 其底层是基于…

屏幕字体种类介绍

[ Script and font support in Windows ] [Windows 中的脚本和字体支持&#xff3d; 在Windows 2000 以前&#xff0c;Windows 的每个主要版本都会添加对新脚本的文本显示支持。本文介绍了每个主要版本中的更改。 Since before Windows 2000, text-display support for new scr…

ARM PAC/BTI/MTE三剑客精讲与实战

一、PAC指针认证精讲与实战 思考 1、什么是栈溢出攻击&#xff1f;什么是代码重用攻击&#xff1f;区别与联系&#xff1f; 2、栈溢出攻击的软&硬件缓解技术有哪些&#xff1f;在TF-A&OPTEE上的应用&#xff1f; 3、什么是ROP攻击&#xff1f;对ROP攻击的缓解技术&…

【医学大模型 知识增强】SMedBERT:结构化语义知识 + 医学大模型 = 显著提升大模型医学文本挖掘性能

SMedBERT&#xff1a;结构化语义知识 医学大模型 显著提升医学文本挖掘任务性能 名词解释结构化语义知识预训练语言模型医学文本挖掘任务 提出背景具体步骤提及-邻居混合注意力机制实体嵌入增强实体描述增强三元组句子增强 提及-邻居上下文建模域内词汇权重学习领域自监督任务…

Swift Combine 有序的异步操作 从入门到精通十二

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

论文阅读-面向公平性的分布式系统负载均衡机制

摘要 当一组自利的用户在分布式系统中共享多个资源时&#xff0c;我们面临资源分配问题&#xff0c;即所谓的负载均衡问题。特别地&#xff0c;负载均衡被定义为将负载分配到分布式系统的服务器上&#xff0c;以便最小化作业响应时间并提高服务器的利用率。在本文中&#xff0…