C# 英语纠错 LanguageTool
WPF中,对单词拼写错误,textbox有相应的附加属性可以设置。
<TextBox SpellCheck.IsEnabled="True" />
但是此属性只在WPF 4,即.netFramework 4.0,才有效。
并且只支持English、Spanish、French 和German
LanguageTool
单词纠错,有一个第三方开源资源可以使用。
1. 官方纠错页面:https://www.languagetool.org/


3. LanguageTool Github源码
如何使用LanguageTool
准备环境
1. 下载最新版本(桌面离线版)
2. 解压后,点击languagetool-server.jar,启动服务器模式

启动前提:java环境 下载JavaSetup链接
如需要静默安装java环境,可以使用以下bat命令行:
@echo off
cls set jdkPath=JavaSetup8u211.exe
rem 设置jdk安装路径,jre安装路径
set commonPath=C:\Program Files (x86)
set jreinstallPath="%commonPath%\jre1.8.0_211" echo.
echo 正在安装jre,需要二、三分钟,请不要执行其他操作
echo.
start /w %jdkPath% /L "%commonPath%\installjava.log" /s
ADDLOCAL="ToolsFeature,SourceFeature,PublicjreFeature"
INSTALLDIR=%jreinstallPath%
WEB_JAVA=0 AUTO_UPDATE=0
echo 安装完成,%jreinstallPath% pause
启动服务模式的方式:以命令行的方式启动
java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081
如果需要静默启动,可以新建一个bat文件,放在languageTool离线包文件的外面,使用以下bat脚本:
@echo off echo.
echo 正在启动language-tool-server...
cd LanguageTool-4.5
echo java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081
java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081 pause
英语纠错
1. 调用纠错API
拼接访问地址
访问的端口,是上面环境准备时设置的,也可以使用其它的端口。
接口必填参数:语言、请求文本
请求文本,需要转换为Url编码字符串。
private static string GetRequestUrl(string queryText, string language = "en-US")
{
var requestUrl = "http://localhost:8081/v2/check?" +
$"language={language}&text={WebUtility.UrlEncode(queryText)}"; return requestUrl;
}
请求Api,返回纠错结果。(返回结果,相对应的,也需要将Url编码字符串,转换回文本字符串)
public static async Task<CheckEnglishSentenceResponse> CheckEnglishSentenceAsync(string queryText)
{
var requestUrl = GetRequestUrl(queryText);
var result = await RequestUrlAsync(requestUrl); var response = JsonConvert.DeserializeObject<CheckEnglishSentenceResponse>(result);
return response;
}
辅助方法:
protected static async Task<string> RequestUrlAsync(string requestUrl)
{
if (string.IsNullOrWhiteSpace(requestUrl))
{
return string.Empty;
} try
{
return await RequestDataAsync(requestUrl);
}
catch (Exception e)
{
if (e.Message.Contains(""))
{
try
{
await Task.Delay(TimeSpan.FromSeconds());
return await RequestUrlAsync(requestUrl);
}
catch (Exception exception)
{
}
}
return string.Empty;
}
} private static async Task<string> RequestDataAsync(string requestUrl)
{
WebRequest translationWebRequest = WebRequest.Create(requestUrl); var response = await translationWebRequest.GetResponseAsync(); using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream ?? throw new InvalidOperationException(),
Encoding.GetEncoding("utf-8")))
{
string result = reader.ReadToEnd();
var decodeResult = Unicode2String(result);
return decodeResult;
}
}
} /// <summary>
/// Unicode转字符串
/// </summary>
/// <param name="source">经过Unicode编码的字符串</param>
/// <returns>正常字符串</returns>
protected static string Unicode2String(string source)
{
return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), )));
}
2. 解析纠错结果
数据类:
[DataContract]
public class CheckEnglishSentenceResponse
{
[DataMember(Name = "matches")]
public List<EnglishSentenceCheckMatchInfo> MatchInfos { get; set; }
}
[DataContract]
public class EnglishSentenceCheckMatchInfo
{
[DataMember(Name = "message")]
public string Message { get; set; }
[DataMember(Name = "shortMessage")]
public string ShortMessage { get; set; } [DataMember(Name = "context")]
public CheckMatchContext CheckMatchContext { get; set; } [DataMember(Name = "replacements")]
public List<CheckMatchReplacement> Replacements { get; set; }
}
[DataContract]
public class CheckMatchContext
{
[DataMember(Name = "offset")]
public int StartIndex { get; set; }
[DataMember(Name = "length")]
public int Length { get; set; }
[DataMember(Name = "text")]
public string Text { get; set; }
} [DataContract]
public class CheckMatchReplacement
{
[DataMember(Name = "value")]
public string Replacement { get; set; }
}
纠错展示:
string matchString = string.Empty;
int index = ;
if (MatchInfos != null)
{
foreach (var checkMatchInfo in MatchInfos)
{
var context = checkMatchInfo.CheckMatchContext;
var message = string.IsNullOrEmpty(checkMatchInfo.ShortMessage)? checkMatchInfo.Message: checkMatchInfo.ShortMessage;
matchString += $"{index++}. " + message + " : " + context.Text.Substring(context.StartIndex, context.Length) + "\r\n";
if (checkMatchInfo.Replacements != null && checkMatchInfo.Replacements.Count > )
{
matchString += "Suggest : " + checkMatchInfo.Replacements[].Replacement + "\r\n\r\n";
}
}
} return matchString;
以下是案例:

请求本地的后台接口时,会有访问记录:

此案例的源代码,可参考Github-ErrorCorrection
使用指导
安装Java环境
进入文件夹LanguageTool,点击打开InstallJavaEnvironment.bat安装Java
启动本地服务LanguageTool
进入文件夹LanguageTool,点击打开StartLanguageToolServer.bat,启动本地离线英语纠错服务。
访问方式:http://localhost:8081/v2/check?language=en-Us&text=buttton
C# 英语纠错 LanguageTool的更多相关文章
- 一名IT从业者的英语口语能力成长路径
一名IT从业者的英语口语能力成长路径 来源: 微信公众号 发布时间: 2014-03-12 22:53 阅读: 6134 次 推荐: 24 原文链接 [收藏] 这篇文章是我最近十天口 ...
- 纠错式教学法对比鼓励式教学法 -----Lily、贝乐、英孚,乐加乐、剑桥国际、优学汇、北外青少
一.关于两种英语教学法的争议 在英语教学方面,主要有纠错式教学法(目前主要对应国内听说读写四位一体的教学法)和鼓励式教学法(目前对应国内听说为主的教学法),这两种教学方法其实是各有千秋,各有利弊的. ...
- 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...
- 课堂笔记&总结与遇错纠错篇
一.课堂笔记 二.个人总结 在学习和工作JDK是必不可少的程序员必备工具,遇到问题可以在帮助文档寻找答案! 接受能力不足,老师讲的知识点过去了,我经常还在想上一个知识点.希望老师有时候重点可以讲慢点哈 ...
- 语法检查程序LanguageTool学习和使用笔记
这是LanguageTool的官方语法规则说明,一定要仔细研究,学会这个语法,就可以自己编写语法检查规则了,这篇文档上说,编写这份语法检查文档,你甚至都不需要是一名程序员: http://wiki.l ...
- 《学技术练英语》PPT分享
之前做的一个PPT,分享给博客园的同学. 下载地址: 学技术练英语.pdf 技术是靠自己去学的,学技术不能仅仅是看书看博客,最好是有实践,不管是做实验去验证,还是写各种代码去玩各种特性,还是造轮子都是 ...
- [下载]北京新版小学英语五年级上册mp3点读APP
义务教育教科书小学英语五年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:97872001 ...
- [Android下载]北京新版小学英语三年级上册点读手机软件
小学英语三年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:9787200108781 ...
- github 相关英语
github 相关英语 repository n. 仓库 A repository contains all the files for your project, including the rev ...
随机推荐
- 《Java基础知识》Java接口和抽象类的区别
抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...
- tune kubernetes eviction parameter
Highlight 本文会介绍kubernetes中关于集群驱逐的相关参数, 合理设置驱逐速率的考虑因素, 但是不会涉及node层面资源的驱逐阈值的设置. Basic 在kubernetes中, 如果 ...
- Winform项目常用配置方法
在我们做项目的时候经常遇到需要动态配置系统的情况,比如说10台电脑装了同一个软件,需要识别唯一码,这时候我们会用到配置方法. 具体方法如下: 1) Config文件 里面增加你需要的变量,具体用法如下 ...
- 剑指offer笔记面试题2----实现Singleton模式
题目:设计一个类,我们只能生成该类的一个实例. 解法一:单线程解法 //缺点:多线程情况下,每个线程可能创建出不同的的Singleton实例 #include <iostream> usi ...
- SSM框架整合之练习篇
SSM的练习 : 1开发环境 数据库:mysql5.5以上版本. Jdk:1.7 开发环境:Eclipse mars2 Spring:4.2.4 Mybatis:3.2.7 Tomcat:7 2数据库 ...
- 开源Odoo13更新的模块功能信息(译文)
本文来源江苏欧度软件:www.odooyun.com 本次Odoo13已于10月初发布,更新的模块有:Odoo会计模块.Odoo活动项目模块.Odoo13审批模块.Odoo评价.客户关系管理(CRM) ...
- Redis中几个简单的概念:缓存穿透/击穿/雪崩,别再被吓唬了
Redis中几个“看似”高大上的概念,经常有人提到,某些好事者喜欢死扣概念,实战没多少,嘴巴里冒出来的全是高大上的名词,个人一向鄙视概念党,呵呵! 其实这几个概念:缓存穿透/缓存击穿/缓存雪崩,有一个 ...
- Bash脚本编程之脚本基础和bash配置文件
脚本基础 参考资料:Shell Scripts (Bash Reference Manual) 不严谨地说,编程语言根据代码运行的方式,可以分为两种方式: 编译运行:需要先将人类可识别的代码文件编译成 ...
- CodeForces - 5C(思维+括号匹配)
题意 https://vjudge.net/problem/CodeForces-5C 给出一个括号序列,求出最长合法子串和它的数量. 合法的定义:这个序列中左右括号匹配. 思路 这个题和普通的括号匹 ...
- react中使用prop-types检测props数据类型
一.为什么使用prop-types 在多人开发时,当被人使用自己定义的组件时,有可能出现类型传错的情况,而在自己的组件上加上prop-types,他可以对父组件传来的props进行检查,加入父组件中想 ...