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之构造器
1.构造方法的作用:在new创建对象时为其赋值. 2.构造方法的分类: ①无参构造public 同类名(){},有参构造public 同类名(参数列表){语句}. ②构造方法没有方法名,没有返回值类型 ...
- 天天动听API
本次分析的是天天动听API,天天动听有一点比较好,就是搜索返回直接有歌曲播放的地址了,并且有无损的音频 搜索歌曲API:http://so.ard.iyyin.com/s/song_with_out? ...
- 《Java练习题》习题集三
编程合集: https://www.cnblogs.com/jssj/p/12002760.html Java总结:https://www.cnblogs.com/jssj/p/11146205.ht ...
- QForkMasterInit: system error caught. error code=0x000005af, message=VirtualAllocEx failed.(遇到还没试过)
今天在使用Redis的时候出现以下错误: QForkMasterInit: system error caught. error code=0x000005af, message=VirtualAll ...
- jquery-获取button的值
<button id="test" name="test_name" value="test_value"></butto ...
- AI行业精选日报_人工智能(12·18)
百度Apollo升级自动驾驶平台,发布车路协同.智能车联两大平台 12 月 18 日消息,Apollo 发布了全球首个点到点城市自动驾驶开放能力.自动驾驶云.新一代智能交通解决方案.小度车载 2020 ...
- IT兄弟连 HTML5教程 使用盒子模型设计页面布局
布局所涉及的技术非常很多,足以另写单独的一本书了.在本节中主要介绍网站中最常用的布局方案,包括区块框居中.两列浮动.三列浮动及多列浮动的区块框. 1 居中设计 区块框居中的设计是在网页布局中常用的技 ...
- JavaScript工具库
jPublic 交流QQ群:1017567122 前言 在我们开发项目的时候,无论项目规模大小,在所难免会写一些工具型函数来解决一些问题,随着项目开发和维护的时间越来越长,这些工具型函数会越来越多,同 ...
- Lucene&Solr框架之第一篇
2.信息检索 信息检索是计算机世界中非常重要的一种功能.信息检索不仅仅是指从数据库检索数据,还包括从文件.网页.邮件.用户手输入的内容中检索数据.通过怎样的高效方式将用户想要的信息快速提取出来,是计算 ...
- How to: Generate XPO Business Classes for Existing Data Tables 如何:为现有数据表生成 XPO 业务类
From the Tutorial and other documentation sources, you learned how to create business classes for yo ...