ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 英语纠错 LanguageTool

2019-07-01 12:41:48  阅读:335  来源: 互联网

标签:set string get C# requestUrl echo LanguageTool 纠错 public


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

<TextBox SpellCheck.IsEnabled="True" />

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

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

LanguageTool

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

如何使用LanguageTool

准备环境

1. 下载最新版本(桌面离线版

2.  解压后,点击languagetool-server.jar,启动服务器模式

启动前提:java环境  下载JavaSetup链接

如需要静默安装java环境,可以使用以下bat命令行:

 

 1 @echo off
 2 cls
 3 
 4 set  jdkPath=JavaSetup8u211.exe
 5 rem  设置jdk安装路径,jre安装路径
 6 set  commonPath=C:\Program Files (x86)
 7 set  jreinstallPath="%commonPath%\jre1.8.0_211"
 8  
 9 echo.
10 echo 正在安装jre,需要二、三分钟,请不要执行其他操作
11 echo.
12 start /w %jdkPath% /L "%commonPath%\installjava.log" /s 
13 ADDLOCAL="ToolsFeature,SourceFeature,PublicjreFeature"  
14 INSTALLDIR=%jreinstallPath%
15 WEB_JAVA=0 AUTO_UPDATE=0 
16 echo 安装完成,%jreinstallPath%
17 
18 pause

 

启动服务模式的方式:以命令行的方式启动

java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081

如果需要静默启动,可以新建一个bat文件,放在languageTool离线包文件的外面,使用以下bat脚本:

1 @echo off
2 
3 echo.
4 echo 正在启动language-tool-server...
5 cd LanguageTool-4.5
6 echo java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081
7 java -cp languagetool-server.jar org.languagetool.server.HTTPServer --port 8081
8 
9 pause

英语纠错

1. 调用纠错API

拼接访问地址

访问的端口,是上面环境准备时设置的,也可以使用其它的端口。

接口必填参数:语言、请求文本

请求文本,需要转换为Url编码字符串。

1     private static string GetRequestUrl(string queryText, string language = "en-US")
2     {
3         var requestUrl = "http://localhost:8081/v2/check?" +
4                          $"language={language}&text={WebUtility.UrlEncode(queryText)}";
5 
6         return requestUrl;
7     }

请求Api,返回纠错结果。(返回结果,相对应的,也需要将Url编码字符串,转换回文本字符串)

1     public static async Task<CheckEnglishSentenceResponse> CheckEnglishSentenceAsync(string queryText)
2     {
3         var requestUrl = GetRequestUrl(queryText);
4         var result = await RequestUrlAsync(requestUrl);
5 
6         var response = JsonConvert.DeserializeObject<CheckEnglishSentenceResponse>(result);
7         return response;
8     }

辅助方法:

 1     protected static async Task<string> RequestUrlAsync(string requestUrl)
 2     {
 3         if (string.IsNullOrWhiteSpace(requestUrl))
 4         {
 5             return string.Empty;
 6         }
 7 
 8         try
 9         {
10             return await RequestDataAsync(requestUrl);
11         }
12         catch (Exception e)
13         {
14             if (e.Message.Contains("502"))
15             {
16                 try
17                 {
18                     await Task.Delay(TimeSpan.FromSeconds(10));
19                     return await RequestUrlAsync(requestUrl);
20                 }
21                 catch (Exception exception)
22                 {
23                 }
24             }
25             return string.Empty;
26         }
27     }
28 
29     private static async Task<string> RequestDataAsync(string requestUrl)
30     {
31         WebRequest translationWebRequest = WebRequest.Create(requestUrl);
32 
33         var response = await translationWebRequest.GetResponseAsync();
34 
35         using (Stream stream = response.GetResponseStream())
36         {
37             using (StreamReader reader = new StreamReader(stream ?? throw new InvalidOperationException(),
38                 Encoding.GetEncoding("utf-8")))
39             {
40                 string result = reader.ReadToEnd();
41                 var decodeResult = Unicode2String(result);
42                 return decodeResult;
43             }
44         }
45     }
46 
47     /// <summary>
48     /// Unicode转字符串
49     /// </summary>
50     /// <param name="source">经过Unicode编码的字符串</param>
51     /// <returns>正常字符串</returns>
52     protected static string Unicode2String(string source)
53     {
54         return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(
55             source, x => string.Empty + Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)));
56     }
View Code

 

2. 解析纠错结果

 数据类:

 1     [DataContract]
 2     public class CheckEnglishSentenceResponse
 3     {
 4         [DataMember(Name = "matches")]
 5         public List<EnglishSentenceCheckMatchInfo> MatchInfos { get; set; }
 6     }
 7     [DataContract]
 8     public class EnglishSentenceCheckMatchInfo
 9     {
10         [DataMember(Name = "message")]
11         public string Message { get; set; }
12         [DataMember(Name = "shortMessage")]
13         public string ShortMessage { get; set; }
14 
15         [DataMember(Name = "context")]
16         public CheckMatchContext CheckMatchContext { get; set; }
17 
18         [DataMember(Name = "replacements")]
19         public List<CheckMatchReplacement> Replacements { get; set; }
20     }
21     [DataContract]
22     public class CheckMatchContext
23     {
24         [DataMember(Name = "offset")]
25         public int StartIndex { get; set; }
26         [DataMember(Name = "length")]
27         public int Length { get; set; }
28         [DataMember(Name = "text")]
29         public string Text { get; set; }
30     }
31 
32     [DataContract]
33     public class CheckMatchReplacement
34     {
35         [DataMember(Name = "value")]
36         public string Replacement { get; set; }
37     }

纠错展示:

 1     string matchString = string.Empty;
 2     int index = 1;
 3     if (MatchInfos != null)
 4     {
 5         foreach (var checkMatchInfo in MatchInfos)
 6         {
 7             var context = checkMatchInfo.CheckMatchContext;
 8             var message = string.IsNullOrEmpty(checkMatchInfo.ShortMessage)? checkMatchInfo.Message: checkMatchInfo.ShortMessage;
 9             matchString += $"{index++}. " + message + " :  " + context.Text.Substring(context.StartIndex, context.Length) + "\r\n";
10             if (checkMatchInfo.Replacements != null && checkMatchInfo.Replacements.Count > 0)
11             {
12                 matchString += "Suggest :  " + checkMatchInfo.Replacements[0].Replacement + "\r\n\r\n";
13             }
14         }
15     }
16 
17     return matchString;

以下是案例:

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

 

此案例的源代码,可参考Github-ErrorCorrection

使用指导

安装Java环境

进入文件夹LanguageTool,点击打开InstallJavaEnvironment.bat安装Java

启动本地服务LanguageTool

进入文件夹LanguageTool,点击打开StartLanguageToolServer.bat,启动本地离线英语纠错服务。
访问方式:http://localhost:8081/v2/check?language=en-Us&text=buttton

标签:set,string,get,C#,requestUrl,echo,LanguageTool,纠错,public
来源: https://www.cnblogs.com/kybs0/p/11113359.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有