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 ...
随机推荐
- 批量SSH key-gen无密码登陆认证脚本
SSH key-gen无密码登录认证脚本 使用为了让linux之间使用ssh不需要密码,可以采用了数字签名RSA或者DSA来完成.主要使用ssh-key-gen实现. 通过 ssh-key-gen 来 ...
- SpringBoot2基础,进阶,数据库,中间件等系列文章目录分类
本文源码:GitHub·点这里 || GitEE·点这里 一.文章分类 1.入门基础 SpringBoot2:环境搭建和RestFul风格接口 2.日志管理 SpringBoot2:配置Log4j2, ...
- c++-面向对象:类和对象
类和对象 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string.h> using names ...
- Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
场景 Nginx入门简介和反向代理.负载均衡.动静分离理解 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ub ...
- 集合系列 Map(十二):HashMap
HashMap 是 Map 基于哈希散列算法的实现,其在 JDK1.7 中采用了数组+链表的数据结构.在 JDK1.8 中为了提高查询效率,采用了数组+链表+红黑树的数据结构.本文所有讲解均基于 JD ...
- golang的make
golang 分配内存主要有内置函数new和make,今天我们来探究一下make有哪些玩法. map只能为slice, map, channel分配内存,并返回一个初始化的值.首先来看下make有以下 ...
- RocketMq在SparkStreaming中的应用总结
其实Rocketmq的给第三方的插件已经全了,如果大家有兴趣的话请移步https://github.com/apache/rocketmq-externals.本文主要是结合笔者已有的rmq在spar ...
- Java中的日期与时间
日期与时间 最常用的几个类,Date.DateFormat.Calendar.Locale Date 1.无参构造方法 //根据当前系统默认的毫秒值创建时间对象 public Date() { thi ...
- Missing associated label more...
1.加上placeholder,可以为空 2.放在label标签中
- 利用 uDig 生成 GeoServer 可用的 SLD 渲染文件
利用 uDig 生成 GeoServer 可用的 SLD 渲染文件 uDig简介 uDig是一个 open source (EPL and BSD) 桌面应用程序框架,构建在Eclipse RCP和G ...