做一个自动校正英文拼写错误的程序 使用c++

概述一个自动校正英文拼写错误的程序的基本的方法,并提供一个简化的C++实现。这个方法基于编辑距离(Levenshtein距离)和一个预定义的词典。

以下是实现这样一个程序的步骤:

  1. 创建一个词典(单词列表)
  2. 计算编辑距离的函数
  3. 查找最相似单词的函数
  4. 主程序逻辑
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <unordered_set>class SpellChecker {
private:std::unordered_set<std::string> dictionary;// 计算两个单词之间的编辑距离int levenshteinDistance(const std::string& s1, const std::string& s2) {std::vector<std::vector<int>> dp(s1.length() + 1, std::vector<int>(s2.length() + 1, 0));for (int i = 0; i <= s1.length(); i++)dp[i][0] = i;for (int j = 0; j <= s2.length(); j++)dp[0][j] = j;for (int i = 1; i <= s1.length(); i++) {for (int j = 1; j <= s2.length(); j++) {if (s1[i-1] == s2[j-1])dp[i][j] = dp[i-1][j-1];elsedp[i][j] = 1 + std::min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]});}}return dp[s1.length()][s2.length()];}// 查找最相似的单词std::string findClosestWord(const std::string& word) {std::string closest = word;int minDistance = std::numeric_limits<int>::max();for (const auto& dictWord : dictionary) {int distance = levenshteinDistance(word, dictWord);if (distance < minDistance) {minDistance = distance;closest = dictWord;}}return closest;}public:SpellChecker() {// 初始化词典(这里只是一个简单的示例)dictionary = {"hello", "world", "computer", "program", "algorithm"};}std::string correct(const std::string& word) {if (dictionary.find(word) != dictionary.end()) {return word;  // 单词正确,无需更正}return findClosestWord(word);  // 返回最相似的单词}
};int main() {SpellChecker checker;std::string word;std::cout << "Enter a word: ";std::cin >> word;std::string corrected = checker.correct(word);std::cout << "Corrected word: " << corrected << std::endl;return 0;
}

这个程序的工作原理:

  1. 我们定义了一个SpellChecker类,它包含一个简单的单词词典。
  2. levenshteinDistance函数计算两个单词之间的编辑距离。
  3. findClosestWord函数遍历词典,找出与给定单词编辑距离最小的单词。
  4. correct函数首先检查单词是否在词典中,如果不在,则调用findClosestWord找到最相似的单词。
  5. main函数中,我们创建了一个SpellChecker实例,并使用它来纠正用户输入的单词。

这个实现有以下局限性:

  1. 词典非常小且简单。实际应用中,你需要一个更大、更完整的词典。
  2. 它只考虑了编辑距离,没有考虑其他因素,如单词的使用频率。
  3. 它不处理上下文,只是单独考虑每个单词。
  4. 性能可能不够优化,特别是对于大型词典。

要创建一个更高级的拼写纠正程序,你可能需要考虑:

  1. 使用更高效的数据结构,如Trie树来存储词典。
  2. 实现更复杂的算法,如Peter Norvig的拼写纠正算法。
  3. 考虑单词的使用频率和上下文。
  4. 使用机器学习技术来改进纠正的准确性。
  5. 处理多词短语和整句的纠正。

为代码添加了注释

#include <iostream>                 // 包含输入输出流库
#include <vector>                   // 包含vector容器库
#include <string>                   // 包含string库,用于字符串操作
#include <algorithm>                // 包含算法库,用于std::min
#include <unordered_set>            // 包含无序集合库,用于存储词典class SpellChecker {                // 定义拼写检查器类
private:std::unordered_set<std::string> dictionary;  // 使用无序集合存储词典// 计算两个单词之间的编辑距离(Levenshtein距离)int levenshteinDistance(const std::string& s1, const std::string& s2) {std::vector<std::vector<int>> dp(s1.length() + 1, std::vector<int>(s2.length() + 1, 0));  // 创建动态规划表for (int i = 0; i <= s1.length(); i++)   // 初始化第一列dp[i][0] = i;for (int j = 0; j <= s2.length(); j++)   // 初始化第一行dp[0][j] = j;for (int i = 1; i <= s1.length(); i++) {         // 遍历s1的每个字符for (int j = 1; j <= s2.length(); j++) {     // 遍历s2的每个字符if (s1[i-1] == s2[j-1])                  // 如果字符相同dp[i][j] = dp[i-1][j-1];             // 距离不变elsedp[i][j] = 1 + std::min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]});  // 取插入、删除、替换中的最小值}}return dp[s1.length()][s2.length()];    // 返回最终的编辑距离}// 在词典中查找最相似的单词std::string findClosestWord(const std::string& word) {std::string closest = word;             // 初始化最相似的单词为输入单词int minDistance = std::numeric_limits<int>::max();  // 初始化最小距离为最大整数for (const auto& dictWord : dictionary) {   // 遍历词典中的每个单词int distance = levenshteinDistance(word, dictWord);  // 计算编辑距离if (distance < minDistance) {           // 如果找到更小的距离minDistance = distance;             // 更新最小距离closest = dictWord;                 // 更新最相似的单词}}return closest;                         // 返回最相似的单词}public:SpellChecker() {                            // 构造函数// 初始化词典(这里只是一个简单的示例)dictionary = {"hello", "world", "computer", "program", "algorithm"};}std::string correct(const std::string& word) {  // 纠正拼写的公共方法if (dictionary.find(word) != dictionary.end()) {  // 如果单词在词典中return word;  // 单词正确,无需更正}return findClosestWord(word);  // 返回最相似的单词}
};int main() {                              // 主函数SpellChecker checker;                 // 创建SpellChecker对象std::string word;                     // 声明用于存储用户输入的字符串std::cout << "Enter a word: ";        // 提示用户输入std::cin >> word;                     // 读取用户输入std::string corrected = checker.correct(word);  // 纠正拼写std::cout << "Corrected word: " << corrected << std::endl;  // 输出纠正后的单词return 0;                             // 程序正常结束
}

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

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

相关文章

mac视频压缩简单办法,mac如何把视频压缩到指定大小内存

在数字时代&#xff0c;视频已成为我们日常生活和工作的重要交流工具。然而&#xff0c;视频文件体积庞大&#xff0c;给存储和分享带来了不少困扰。本文将为你揭秘视频压缩的秘密&#xff0c;让你轻松减小视频文件体积&#xff0c;提升分享效率&#xff01; 方法一下载文件压缩…

MySQL 8.4.1 LTS 容器镜像可以下载了

MySQL 8.4.1 LTS 版本和 9.0 是同一天上线的&#xff0c;都是7月1日&#xff0c;只是大家都聚焦在了 9.0 而没注意到 8.4.1&#xff0c;关于 9.0 的内容请戳这里&#xff1a; MySQL 9.0.0 新鲜出炉&#xff01;支持向量类型 MySQL 9.0 的VECTOR文档更新 MySQL 8.4.1 变更 MySQL…

Vue3实现过渡动画

认识动画 在开发中&#xff0c;我们想要给一个组件的显示和消失添加某种过渡动画&#xff0c;可以很好的增加用户体验&#xff1a; React框架本身并没有提供任何动画相关的API&#xff0c;所以在React中使用过渡动画我们需要使用一个第三方库 react-transition-group&#xf…

开发者工具攻略:前端测试的极简指南

前言 许多人存在一个常见的误区&#xff0c;认为测试只是测试工程师的工作。实际上&#xff0c;测试是整个开发团队的责任&#xff0c;每个人都应该参与到测试过程中。 在这篇博客我尽量通俗一点地讲讲我们前端开发过程中&#xff0c;该如何去测试 浏览器开发者工具简介 开…

【高中数学/极值问题】一条长为L的绳子,一面靠墙,另外三边组成矩形,问此矩形最大面积能是多少?

【问题】 一条长为L的绳子&#xff0c;一面靠墙&#xff0c;另外三边组成矩形&#xff0c;问此矩形最大面积能是多少&#xff1f; 【示意图】 【解析式】 设垂直于墙的两边长为x&#xff0c;则墙对边长为L-2x&#xff0c;围成的矩形面积Sx(L-2x) 写成标准的解析式为yx(L-2…

本地Windows电脑 连接 Windows 服务器

Windows电脑 连接 Windows 服务器 方式1&#xff1a;直接搜索 在电脑的搜索栏&#xff0c;输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”&#xff0c;打开 远程桌面连接 方式2&#xff1a;运行框打开服务器连接 同时按&#xff1a;Windows徽标键…

数字图像处理、机器视觉(计算机视觉)、计算图形学概念

数字图像处理&#xff08;Digital Image Processing&#xff09;--又称为计算机图像处理&#xff0c;它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程&#xff0c;以提高图像的实用性&#xff0c;达到人们所要求的预期结果。从输入到输出来看&#xff0c;数字图…

java+springboot+Mysql“友书”综合书籍平台系统24489-计算机毕业设计项目选题推荐(附源码)

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;“友书”综合书籍平台当然也不能排除在外。“友书”综合书籍平台系统是以实际运用为开发背景&#xff0c;运用软件工程原…

搜维尔科技:详谈ART的工具追踪技术

您的生产流程中是否已经受益于刀具跟踪系统&#xff1f;您是否意识到它们的价值&#xff1f;因为它们可以优化您的装配顺序&#xff0c;从而节省您的时间和金钱。 目前我们提供两种工具跟踪解决方案&#xff1a; 1.ART与 VERPOSE的解决方案——易于使用的图像识别 安装在工…

‘prettier‘ 不是内部或外部命令,也不是可运行的程序

报错信息&#xff1a;‘prettier’ 不是内部或外部命令、操作系统或可运行的程序 表明系统无法识别prettier这一命令。 解释&#xff1a; 这通常发生在尝试在命令行中运行prettier这个代码格式化工具时&#xff0c;但系统未安装prettier或者prettier没有正确添加到系统的环境…

UE5 05-利用 timeline 插值运动

理解成 unity Dotween DoMove 插值运动即可 AddTimeLine 节点 物体插值运动 物体插值缩放 一个timeline 可以K多个动画帧

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用

基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用 一、功能描述: 上位机通过CAN总线实现对电机的运动控制,主要包含三种模式:位置模式、速度模式以及力矩模式。驱动器硬件核心为STM32F103C8T6,带相电压采集电路以及母线电压采集电路。其中供电电压12V。 PWM中心对…

【Web】Nginx:静态网站部署

Nginx 是一个HTTP和反向代理服务器&#xff0c;邮件代理服务器&#xff0c;以及一个通用的TCP/UDP代理服务器&#xff0c;最初由Igor Sysoev编写。很长一段时间以来&#xff0c;它一直在许多负载较重的俄罗斯网站上运行&#xff0c;包括Yandex、Mail.Ru、VK和Rambler。根据Netc…

DT浏览器很好用

DT浏览器是一款简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;软件使用流畅。DT浏览器的网址收藏&#xff0c;人工智能写作&#xff0c;书法笔记等功能与众不同。DT浏览器的图文识别功能和笔记本搭配使用&#xff0c;可以对内容编辑修改和保存…

RestTemplate、MockMVC、Swagger

rest代码风格 硬编码的部分在实际开发中都是会替换成枚举对象 SpringMVC会自动把json格式的post请求转化为对应接收的 对象 响应请求时&#xff0c;也会自动把 对象转化为 json格式的 RestTemplate 浏览器的地址栏只能提供get请求访问后端&#xff0c;如果要使用post方式发送…

Docker一键部署PostGIS

创建文件 docker-compose.yml version: ‘3.3’ services: db: image: postgis/postgis:14-3.4 container_name: postgres_postgis environment: POSTGRES_DB: ais_spatial_db POSTGRES_USER: root POSTGRES_PASSWORD: my_passwd ports: - “54321:5432” volumes: - pgdata:/v…

混淆矩阵全解析:深度理解目标检测算法性能评估

混淆矩阵全解析&#xff1a;深度理解目标检测算法性能评估 在机器学习和目标检测领域&#xff0c;评估模型的性能是一个至关重要的步骤。混淆矩阵&#xff08;Confusion Matrix&#xff09;是一种常用的工具&#xff0c;用于可视化模型的预测结果与实际标签之间的关系。本文将…

[A-03] ARMv8/ARMv9-多级Cache架构

ver 0.1 前言 前面文章我介绍了Cache的基本架构、Cache的详细的结构&#xff0c;有了一定的cache的基础&#xff0c;对cache机制也有了sense。实际上Cache作为CPU架构中存储机制的核心组件和CPU的微架构以及系统的总线架构还是密切相关的&#xff0c;不同的体系下&#xff0c…

传统数据处理系统存在的问题

传统应用的数据系统架构设计时&#xff0c;应用直接访问数据库系统。当用户访问量增加时&#xff0c;数据库无法支撑日益增长的用户请求的负载&#xff0c;从而导致数据库服务器无法及时响应用户请求&#xff0c;出现超时的错误。 出现这种情况以后&#xff0c;在系统架构上就采…

常用的Linux系统命令

常用的Linux系统命令 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一些常用的Linux系统命令&#xff0c;这些命令对于系统管理员、开发人员和普…