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

一、说明

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

        您可以找到我创建的拼写检查器应用程序: 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 wordone_edit_away = edits_one(word)# Generate all possible edits two edits away by applying edits_one to each one-edit-away edittwo_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.mzph.cn/news/681273.shtml

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

相关文章

Waymo数据集下载与使用

在撰写论文时,接触到一个自动驾驶数据集Waymo Dataset 论文链接为:https://arxiv.org/abs/1912.04838v7 项目链接为:https://github.com/waymo-research/waymo-open-dataset 数据集链接为:https://waymo.com/open waymo提供了两种…

23种计模式之Python/Go实现

目录 设计模式what?why?设计模式:设计模式也衍生出了很多的新的种类,不局限于这23种创建类设计模式(5种)结构类设计模式(7种)行为类设计模式(11种) 六大设计原则开闭原则里氏替换原…

单链表基础知识点

单链表的读取 对于单链表实现获取第i个元素的数据的操作 GetElem&#xff0c;在算法上&#xff0c;相对要麻烦一些。 获得链表第i个数据的算法思路: 声明一个结点p指向链表第一个结点&#xff0c;初始化j从1开始;当j<i时&#xff0c;就遍历链表&#xff0c;让p的指针向后移…

【小赛1】蓝桥杯双周赛第5场(小白)思路回顾

我的成绩&#xff1a;小白(5/6) 完稿时间&#xff1a;2024-2-13 比赛地址&#xff1a;https://www.lanqiao.cn/oj-contest/newbie-5/ 相关资料&#xff1a; 1、出题人题解&#xff1a;“蓝桥杯双周赛第5次强者挑战赛/小白入门赛”出题人题解 - 知乎 (zhihu.com) 2、矩阵快速幂&…

MATLAB | 情人节画个花瓣venn图?

之前七夕节情人节各种花&#xff0c;相册&#xff0c;爱心啥的都快画够了&#xff0c;今年画个花瓣韦恩图&#xff1f; 花瓣上的数字是仅属于该类的样本数&#xff0c;而中心的数字是属于每一类的样本数 教程部分 0 数据准备 % 给组起名t1 t2 t3...t15 setName compose(t%d,…

mysql数据库concat指定连接符号

SELECT CONCAT_WS(;;;, 你好,华为) FROM DUAL;

uniapp API文档地址 以及 HBuilder安装

uniapp API文档地址 以及 HBuilder安装 一、进入 当前网站 uni-app 官网 [uni-app](https://zh.uniapp.dcloud.io/quickstart-hx.html)二、点击截图下载文件 三、 进入 当前网站 &#xff08;https://www.dcloud.io/hbuilderx.html&#xff09; 浏览器会识别 也可以自行选择…

Java 基于 SpringBoot+Vue 的社区医院系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Hive的Join连接

前言 Hive-3.1.2版本支持6种join语法。分别是&#xff1a;inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左…

《Java 简易速速上手小册》第4章:Java 中的异常处理(2024 最新版)

文章目录 4.1 异常类型和错误 - 遇见你的小怪兽4.1.1 基础知识4.1.2 重点案例&#xff1a;文件读取处理4.1.3 拓展案例 1&#xff1a;处理空指针异常4.1.4 拓展案例 2&#xff1a;捕获多个异常 4.2 异常处理机制 - 穿上你的超级英雄斗篷4.2.1 基础知识4.2.2 重点案例&#xff1…

【开源】SpringBoot框架开发食品生产管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…

[FFmpeg学习]从视频中获取图片

从视频中获取图片是一个比较直观的例子&#xff0c;这里从一个基础的例子来查看FFmpeg相关api的使用&#xff0c;从mp4文件中获取一帧图像&#xff0c;保存为jpeg格式图片&#xff0c;mp4文件比较好准备&#xff0c;一般手机录屏文件就是mp4格式。 原理还是比较清楚&#xff0…

2.13学习总结

1.出差&#xff08;Bleeman—ford&#xff09;&#xff08;spfa&#xff09; &#xff08;dijkstra&#xff09; 2.最小生成树&#xff08;prim&#xff09;&#xff08;Kruskal&#xff09; 最短路问题&#xff1a; 出差https://www.luogu.com.cn/problem/P8802 题目描述 AA …

Netty应用(九) 之 编解码器概念 Netty常见的编解码器

目录 22.编解码器 22.1 编解码的概念 22.2 netty中的编解码 22.3 序列化 23.编解码器在使用过程中的两部分核心内容 23.1 序列化协议&#xff08;编码格式&#xff09;&#xff08;传输数据的格式&#xff09; 23.1.1 Java默认的序列化与反序列化 23.1.2 XML的序列化与反…

Ps:焦点堆栈

焦点堆栈 Focus Stacking是一种摄影和图像处理技术&#xff0c;通过合并多张在不同焦距拍摄的照片来创建一张具有更大景深的图像&#xff0c;特别适用于微距摄影、风景摄影和任何需要在整个场景中保持尖锐对焦的情况。 ◆ ◆ ◆ 拍摄注意事项 1、使用三脚架 为了确保图像之间…

【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以打包成功,使用vite创建应用

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Ny421a7nA/ 【Tauri】&#xff08;3&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows上搭建环境&#xff0c;安装node&#xff0c;rust环境&#xff0c;可以…

CorelDRAW2024国内专业个人免费版下载

CorelDRAW是一款屡获殊荣的图形和图像编辑软件&#xff0c;包含两个绘图应用程序&#xff1a;一个用于矢量图及页面设计&#xff0c;另一个用于图像编辑。自1989年进入中国市场以来&#xff0c;CorelDRAW不断推出新的版本和功能&#xff0c;以满足用户不断变化的需求。 CorelD…

【C++计算几何】点是否在线段上

题目描述 输入一个点Q和一条线段P1P2的坐标&#xff0c;判断这个点是否在该线段上。 输入 一行&#xff0c;共六个浮点数&#xff0c;依次表示Q&#xff0c;P1和P2的坐标。 输出 一行&#xff0c;一个字符数&#xff0c;“YES”或“NO”分别表示改点在或者不在线段上。 样…

数字图像处理实验记录十(图像分割实验)

一、基础知识 1、什么是图像分割 图像分割就是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程&#xff0c;特性可以是灰度、颜色、纹理等&#xff0c;目标可以对应单个区域&#xff0c;也可以对应多个区域。 2、图像分割是怎么实现的 图像分割算法基于像素值的不连…

ubuntu下如何查看显卡及显卡驱动

ubuntu下如何查看显卡及显卡驱动 使用nvidia-smi 工具查看 查看显卡型号nvida-smi -L $ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 3050 4GB Laptop GPU (UUID: GPU-4cf7b7cb-f103-bf56-2d59-304f8996e28c)当然直接使用nvida-smi 命令可以查看更多信息 $ nvidia-smi Mon Fe…