简单的拼写检查算法

2024-02-09

我的任务是为作业创建一个简单的拼写检查器,但几乎没有提供任何指导,所以想知道是否有人可以帮助我。我并不是在找人为我做作业,但任何关于算法的指导或帮助都会很棒!如果我所问的内容不在该网站的指导范围内,那么我很抱歉,我会去其他地方寻找。 :)

该项目加载正确拼写的小写单词,然后需要根据两个标准提出拼写建议:

  • 一个字母的差异(添加或减去以使单词与字典中的单词相同)。例如,“stack”将是“staick”的建议,“cool”将是“coo”的建议。

  • 一个字母替换。例如,“bad”将是“bod”的建议。

所以,只是为了确保我已经正确解释了..我可能会加载单词[你好,再见,太棒了,好,上帝],然后对(错误拼写的)单词“godd”的建议将是[好,上帝]。

Speed是我在这里主要考虑的因素,所以虽然我认为我知道一种方法来完成这项工作,但我真的不太确定它的效率有多高。我想这样做的方式是创建一个map<string, vector<string>>然后,对于加载的每个正确拼写的单词,将正确拼写的工作添加为映射中的键,并将向量填充为该单词的所有可能的“错误”排列。

然后,当我想要查找一个单词时,我将查看地图中的每个向量,看看该单词是否是拼写正确的单词之一的排列。如果是,我将添加该键作为拼写建议。

但这似乎会占用大量内存,因为每个单词肯定会有数千种排列?如果我最初的拼写正确的单词词典很大,它似乎也会非常非常慢?

我想也许我可以通过只查看与我正在查看的单词相似的键来减少时间。但话又说回来,如果它们在某些方面相似,那么这可能意味着关键将是一个建议,意味着我不需要所有这些排列!

所以,是的,我有点困惑我应该朝哪个方向看。我真的很感激任何帮助,因为我真的不确定如何估计不同做事方式的速度(我们还没有被教导过这一点)完全在课堂上)。


解决问题的更简单方法确实是预先计算的地图[坏词] -> [建议]。

问题是,虽然删除一个字母会产生很少的“坏词”,但对于添加或替换你有many候选人。

所以我建议另一种解决方案;)

注意:您所描述的编辑距离称为编辑距离 http://en.wikipedia.org/wiki/Levenshtein_distance

该解决方案以增量步骤进行描述,通常每个想法的搜索速度应该不断提高,我尝试首先用更简单的想法(在实现方面)来组织它们。只要您对结果感到满意,就可以随时停止。


0. 初步

  • 实现编辑距离算法
  • 将字典存储在排序序列中(std::set例如,虽然已排序std::deque or std::vector性能会更好)

要点:

  • Levenshtein 距离计算使用数组,在每一步中,下一行仅与前一行计算
  • 一行中的最小距离始终优于(或等于)前一行中的最小值

后一个属性允许短路实现:如果您想将自己限制为 2 个错误(阈值),那么只要当前行的最小值大于 2,您就可以放弃计算。一个简单的策略是返回阈值 + 1 作为距离。


1. 第一个暂定

让我们从简单开始吧。

我们将实现线性扫描:对于每个单词,我们计算距离(短路),并列出迄今为止实现较小距离的单词。

它在小型词典上效果很好。


2. 完善数据结构

编辑距离为at least等于长度差。

通过使用一对(长度,单词)而不是单词作为键,您可以将搜索限制在长度范围内[length - edit, length + edit]并大大减少搜索空间。


3. 前缀和修剪

为了改进这一点,我们可以指出,当我们逐行构建距离矩阵时,一个世界被完全扫描(我们寻找的单词),但另一个世界(所指对象)却没有:我们每行只使用一个字母。

这个非常重要的属性意味着对于共享相同初始序列(前缀)的两个指示对象,矩阵的第一行将是相同的。

还记得我要求你存储排序后的字典吗?这意味着共享相同前缀的单词是相邻的。

假设你正在检查你的话cartoon and at car你意识到它不起作用(距离已经太长),那么任何以car也不起作用,你可以跳过以以下开头的单词car.

跳过本身可以线性完成,也可以通过搜索完成(找到第一个具有比car):

  • 如果前缀很长(要跳过的单词很少),则线性效果最好
  • 二分搜索最适合短前缀(要跳过许多单词)

“长”有多长取决于你的字典,你必须测量。我会从二分搜索开始。

注意:长度分区与前缀分区相反,但它会修剪更多的搜索空间


4. 前缀和重用

现在,我们还将尝试尽可能地重复使用计算(而不仅仅是“它不起作用”的结果)

假设你有两个单词:

  • cartoon
  • carwash

您首先逐行计算矩阵,cartoon。然后读书的时候carwash您需要确定公共前缀的长度(此处car)并且您可以保留矩阵的前 4 行(对应于 void,c, a, r).

因此,当开始计算时carwash,您实际上开始迭代w.

为此,只需使用在搜索开始时直接分配的数组,并使其足够大以容纳更大的引用(您应该知道字典中的最大长度是多少)。


5.使用“更好”的数据结构

为了更轻松地使用前缀,您可以使用Trie http://en.wikipedia.org/wiki/Trie或帕特里夏树来存储字典。然而,它不是 STL 数据结构,您需要对其进行扩充,以在每个子树中存储所存储的单词长度范围,因此您必须自己实现。这并不像看起来那么容易,因为存在内存爆炸问题,可能会杀死局部性。

这是最后的选择。实施起来成本很高。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的拼写检查算法 的相关文章

  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • vs2008 c#:Facebook.rest.api如何使用它来获取好友列表?

    如何在此基础上取得进一步的进步 获取好友列表的下一步是什么 string APIKey ConfigurationManager AppSettings API Key string APISecret ConfigurationManag
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 在C中存储对lua函数的引用

    我有一个用 C 实现的基本事件处理程序 我的应用程序中还有一个嵌入式 Lua 解释器 我需要它与事件管理器交互 最终目标是能够拥有一个事件处理程序 在事件触发时同时执行 C 和 Lua 函数 我的问题是我无法想出一种简单的方法来存储对 C
  • 当命名空间应该被继承时,为什么 cxf 对没有命名空间前缀的元素抛出解组错误

    我正在创建一个在 Java 11 Spring Boot 服务器中运行并向 Java 8 服务器发出请求的 SOAP 客户端 我在 Gradle 6 9 版本中使用 cxf rt frontend jaxws 3 4 3 和 cxf rt
  • 如何通知Android Widget重画

    我有一个 Android Widget 使用RemoteViewsFactory为了填充ListView 我的数据源是一个异步 JSON 调用 可以随时完成 它不是推送通知 现在代码位于onDataChanged看起来像这样 Overrid
  • 在 MVC 操作中隐藏查询字符串

    我想将查询字符串隐藏到我的控制器的操作中 在我的应用场景中是这样的 1 我已在新窗口中打开新操作 var check Particular String var url rootUrl Home Preview Docs check win
  • 是否可以通过 flutter app 分享您的位置

    我在 flutter dart 中构建了一个应用程序来访问用户的位置 我现在想通过 Whatsapp 电子邮件等共享用户当前的物理位置 但不是作为坐标 我尝试过地理定位和位置 但似乎只能获取坐标 下面是我的分享按钮的片段 其中显示了坐标 分
  • cls() 函数在类方法中做什么?

    今天查看别人的代码 看到了这样的内容 class A B Omitted bulk of irrelevant code in the class def init self uid None self uid str uid classm
  • 过载解析异常

    不确定这是否是 C 4 特定的 但只是注意到了这一点 考虑以下类 class Base protected void Foo object bar DayOfWeek day class Program Base protected voi
  • PDO 相当于 mysql_fetch_array

    我正在努力处理相当于以下查询的 PDO 该查询计算队列中有多少个新项目 并计算出完成它们需要多少周 从而给我一个工作堆栈时间表 count new to be made new SELECT FLOOR SUM TotalNew 7 AS
  • Unity 容器 - 延迟注入

    假设我有课 class Foo FooBase public Foo Settings settings IDbRepository db base settings this db db 基本上 FooBase 通过构造函数接收设置并从配
  • java.lang.ClassCastException:[Ljava.lang.Object;无法转换或 BeanUtils.copyProperties 不起作用

    我是 JPA 新手 并且 Spring Boot 在使用 Query param 时无法获取 api 响应 我尝试实现内部联接 存储库类 Transactional rollbackFor Exception class Modifying
  • 堆栈分配的 RAII 对象与 DI 原理

    在 C 中 我经常使用 RAII 风格的对象来使代码更可靠 并将它们分配在堆栈上以使代码更具性能 并避免 bad alloc 但是在堆栈上创建具体类的对象违反了依赖倒置 DI 原则并阻止了模拟该对象 考虑以下代码 struct IInput
  • 实体框架工具不适用于 UWP 应用程序 C#

    启动项目 EFGetStartedUWP 是一个通用 Windows 平台应用程序 此版本的 Entity Framework Core 包管理器控制台工具不支持此类项目 有关将 EF Core Tools 与 UWP 项目结合使用的详细信
  • 我可以列表初始化仅移动类型的向量吗?

    如果我通过 GCC 4 7 快照传递以下代码 它会尝试复制unique ptrs 进入向量 include
  • 求解热方程

    我求解金属棒的热方程 一端保持在 100 C 另一端保持在 0 C 如下 import numpy as np import matplotlib pyplot as plt dt 0 0005 dy 0 0005 k 10 4 y max
  • '.' 之前应有主要表达式代币

    我已经为此奋斗了一段时间并环顾四周 但我不确定我做错了什么 错误 错误 标记之前应有主表达式 addElement 方法内的大部分代码都会弹出 涉及 BinaryNode variable 但我完全不知道在这里要做什么 include
  • 在delphi中传递不同枚举类型的混合

    我需要编写一个可以传递不同枚举选择的过程 type TEnumOne eOneFlagOne eOneFlagTwo TEnumTwo eTwoFlagOne eTwoFlagTwo 该方法应该采用不同的枚举 Process eOneFla
  • 如何将 p5.js 画布放入 html div 中

    我正在尝试将 p5 js 添加到网页中某一部分的背景 我是 javascript 新手 不知道如何将这两个部分绑定在一起 您需要在设置中添加代码 确保 html 中的脚本标记中也包含该函数 请注意 您不要在 parent 中添加 var m
  • 使用 Lua 时 C++ 中的堆栈展开

    我最近偶然发现了这个 C Lua 错误 int function for lua lua State L std string s Trouble coming return luaL error L something went wron
  • 用于对所有行进行分页的 Cassandra CQL 方法

    我想以编程方式检查大型 cassandra 表中的所有行 并希望使用 CQL 我知道我可以使用 thrift 来做到这一点 使用 multiget 一次获取 10 000 左右 行 并将最后检索到的密钥传递给下一个 multiget 调用
  • 简单的拼写检查算法

    我的任务是为作业创建一个简单的拼写检查器 但几乎没有提供任何指导 所以想知道是否有人可以帮助我 我并不是在找人为我做作业 但任何关于算法的指导或帮助都会很棒 如果我所问的内容不在该网站的指导范围内 那么我很抱歉 我会去其他地方寻找 该项目加