WPF中,对单词拼写错误,textbox有相应的附加属性可以设置。

<TextBox SpellCheck.IsEnabled="True" />

但是此属性只在WPF 4,即.netFramework 4.0,才有效。

并且只支持English、Spanish、French 和German

LanguageTool

单词纠错,有一个第三方开源资源可以使用。

1. 官方纠错页面:https://www.languagetool.org/

2. LanguageTool API 接口

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的更多相关文章

  1. 一名IT从业者的英语口语能力成长路径

    一名IT从业者的英语口语能力成长路径 来源: 微信公众号  发布时间: 2014-03-12 22:53  阅读: 6134 次  推荐: 24   原文链接   [收藏]   这篇文章是我最近十天口 ...

  2. 纠错式教学法对比鼓励式教学法 -----Lily、贝乐、英孚,乐加乐、剑桥国际、优学汇、北外青少

    一.关于两种英语教学法的争议 在英语教学方面,主要有纠错式教学法(目前主要对应国内听说读写四位一体的教学法)和鼓励式教学法(目前对应国内听说为主的教学法),这两种教学方法其实是各有千秋,各有利弊的. ...

  3. 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)

    摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...

  4. 课堂笔记&总结与遇错纠错篇

    一.课堂笔记 二.个人总结 在学习和工作JDK是必不可少的程序员必备工具,遇到问题可以在帮助文档寻找答案! 接受能力不足,老师讲的知识点过去了,我经常还在想上一个知识点.希望老师有时候重点可以讲慢点哈 ...

  5. 语法检查程序LanguageTool学习和使用笔记

    这是LanguageTool的官方语法规则说明,一定要仔细研究,学会这个语法,就可以自己编写语法检查规则了,这篇文档上说,编写这份语法检查文档,你甚至都不需要是一名程序员: http://wiki.l ...

  6. 《学技术练英语》PPT分享

    之前做的一个PPT,分享给博客园的同学. 下载地址: 学技术练英语.pdf 技术是靠自己去学的,学技术不能仅仅是看书看博客,最好是有实践,不管是做实验去验证,还是写各种代码去玩各种特性,还是造轮子都是 ...

  7. [下载]北京新版小学英语五年级上册mp3点读APP

    义务教育教科书小学英语五年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:97872001 ...

  8. [Android下载]北京新版小学英语三年级上册点读手机软件

    小学英语三年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:9787200108781   ...

  9. github 相关英语

    github 相关英语 repository n. 仓库 A repository contains all the files for your project, including the rev ...

随机推荐

  1. vue之新手使用

    vue中文网站:https://cn.vuejs.org/v2/guide/installation.html  包含了安装.使用.api.视频. 一. 什么是 Vue Vue 是一个前端框架,特点是 ...

  2. 《Java知识应用》Linux系统下word转PDF

    仅供学习,如需商用请联系开发商:https://apireference.aspose.com/java/words Jar包下载路径: 链接: https://pan.baidu.com/s/1s7 ...

  3. 重载和重写的区别?构造器 Contructor 构造器是否可被 override?

    重载 发生在同一类,方法名必须相同,参数类型不同,顺序不同,类型不同,方法返回值和返回类型可以不同 重写 发生在子父类,方法名.参数名参数列表必须相同.返回值范围小于等于父类,抛出异常范围小于等于父类 ...

  4. keras实现mnist手写数字数据集的训练

    网络:两层卷积,两层全连接,一层softmax 代码: import numpy as np from keras.utils import to_categorical from keras imp ...

  5. IE浏览器下载文件保存时提示:“你没有权限在此位置中保存文件”解决办法

    E浏览器下载文件保存时提示 解决办法: 1.Win + R,打开运行命令,输入gpedit.msc,如图所示 2.打开计算机本地组策略编辑器:选择计算机配置-windows设置-安全设置-本地策略-安 ...

  6. eclipse 的安装

    打开eclipse官网 https://www.eclipse.org/ 点击此处 再点击 最后点击下载 然后一路下一步安装即可 添加中文语言包 打开eclipse官网 https://www.ecl ...

  7. 最新IDEA永久激活

    此教程已支持最新2019.2版本 本教程适用Windows.Mac.Ubuntu等所有平台. 激活前准备工作 配置文件修改已经不在bin目录下直接修改,而是通过Idea修改 如果输入code一直弹出来 ...

  8. 面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的

    为什么ConcurrentHashMap是线程安全的 JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一 ...

  9. web中状态码301和302的区别

    web中状态码301和302的区别 总的区别就是:302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的.而301重定向是永久 ...

  10. redis集群搭建及常用操作

    前言: Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供 ...