Azure AI 服务之文本翻译

前端之家收集整理的这篇文章主要介绍了Azure AI 服务之文本翻译前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

功能了!

介绍 Azure 认识服务中 Language 分类中的文本翻译服务(Translator Text API

支持多种语言。使用者可用于构建应用程序、网站、工具或任何需要多语言支持解决方案。该服务是通过 REST API 提供的,所以我们可以以任何语言来调用它们。本文笔者使用 C# 通过构建一个 WPF 程序来演示如何通过简单的几步就能创建一个像模像样的翻译程序:

TEXT_TRANSLATION_API_ENDPOINT = BING_SPELL_CHECK_API_ENDPOINT = ;

WebRequest.Headers.Add(,);

TEXT_TRANSLATION_API_SUBSCRIPTION_KEY = BING_SPELL_CHECK_API_SUBSCRIPTION_KEY = ;

获取支持的语言列表

支持哪些语言!下面的请求能够返回翻译服务支持的语言列表:

uri = TEXT_TRANSLATION_API_ENDPOINT + ;

代码封装到下面的函数中:

支持的语言 uri = TEXT_TRANSLATION_API_ENDPOINT + =添加认证信息 WebRequest.Headers.Add(= </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 把返回的 xml 信息抽取到数组中</span> response =<span style="color: #000000"&gt; WebRequest.GetResponse(); </span><span style="color: #0000ff"&gt;using</span> (Stream stream =<span style="color: #000000"&gt; response.GetResponseStream()) { DataContractSerializer dcs </span>= <span style="color: #0000ff"&gt;new</span> DataContractSerializer(<span style="color: #0000ff"&gt;typeof</span>(List<<span style="color: #0000ff"&gt;string</span>><span style="color: #000000"&gt;)); List</span><<span style="color: #0000ff"&gt;string</span>> languagesForTranslate = (List<<span style="color: #0000ff"&gt;string</span>><span style="color: #000000"&gt;)dcs.ReadObject(stream); languageCodes </span>=<span style="color: #000000"&gt; languagesForTranslate.ToArray(); }

}

函数后,languageCodes 中的内容如下图所示:

内容是无法显示用户的,还需要把它们转换成对用户友好的名称,因此我们定义 GetLanguageNames 函数完成这个功能

SortedDictionary<,> languageCodesAndTitles = SortedDictionary<,>(Comparer<>.Create((a,b) => .Compare(a,b, 中文的语言名称 uri = TEXT_TRANSLATION_API_ENDPOINT + == = = DataContractSerializer(Type.GetType( (Stream stream =</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 把返回的 xml 信息抽取到数组中</span> <span style="color: #0000ff"&gt;var</span> response =<span style="color: #000000"&gt; request.GetResponse(); </span><span style="color: #0000ff"&gt;string</span><span style="color: #000000"&gt;[] languageNames; </span><span style="color: #0000ff"&gt;using</span> (Stream stream =<span style="color: #000000"&gt; response.GetResponseStream()) { languageNames </span>= (<span style="color: #0000ff"&gt;string</span><span style="color: #000000"&gt;[])dcs.ReadObject(stream); } </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 把<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a>的语言列表及其友好<a href="/tag/mingcheng/" target="_blank" class="keywords">名称</a>保存到字典数据结构中, </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 随后会把它们绑定给 combo <a href="/tag/Box/" target="_blank" class="keywords">Box</a> 控件进行<a href="/tag/xianshi/" target="_blank" class="keywords">显示</a></span> <span style="color: #0000ff"&gt;for</span> (<span style="color: #0000ff"&gt;int</span> i = <span style="color: #800080"&gt;0</span>; i < languageNames.Length; i++<span style="color: #000000"&gt;) { languageCodesAndTitles.Add(languageNames[i],languageCodes[i]); }

}

中文显示的语言名称

支持翻译的语言列表后,就可以通过 UI 控件把它们显示出来:

count = ( menuItem Box.Items.Add(menuItem); ToLanguageComboBox.Items.Add(menuItem); }
</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 设置默认的源语言和目标语言</span>
FromLanguageCombo<a href="/tag/Box/" target="_blank" class="keywords">Box</a>.SelectedItem = <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;英语</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;
ToLanguageCombo<a href="/tag/Box/" target="_blank" class="keywords">Box</a>.SelectedItem </span>= <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;简体<a href="/tag/zhongwen/" target="_blank" class="keywords">中文</a></span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;;

}

中文":

TEXT_TRANSLATION_API_ENDPOINT + + 待翻译文本 + + 源语言 + + 目标语言

功能的函数

TranslateButton_Click( textToTranslate = fromLanguage =Box.SelectedValue.ToString(); fromLanguageCode = toLanguageCode =Box.SelectedValue.ToString()];
</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 如果要翻译的文本是英语,还可以进行拼写检查</span>
<span style="color: #0000ff"&gt;if</span> (fromLanguageCode == <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;en</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)
{
    textToTranslate </span>=<span style="color: #000000"&gt; CorrectSpelling(textToTranslate);
    </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 把更新后的文本保存到 UI 控件上</span>
    TextToTranslate.Text =<span style="color: #000000"&gt; textToTranslate;     
}

</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 处理文本为空和不需要翻译的情况</span>
<span style="color: #0000ff"&gt;if</span> (textToTranslate == <span style="color: #800000"&gt;""</span> || fromLanguageCode ==<span style="color: #000000"&gt; toLanguageCode)
{
    TranslatedText.Text </span>=<span style="color: #000000"&gt; textToTranslate;
    </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt;;
}

</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 通过 http 请求执行翻译任务</span>
<span style="color: #0000ff"&gt;string</span> uri = <span style="color: #0000ff"&gt;string</span>.Format(TEXT_TRANSLATION_API_ENDPOINT + <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;Translate?text=</span><span style="color: #800000"&gt;"</span> +<span style="color: #000000"&gt;
    System.Web.HttpUtility.UrlEncode(textToTranslate) </span>+ <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;&amp;from={0}&amp;to={1}</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;,fromLanguageCode,toLanguageCode);
</span><span style="color: #0000ff"&gt;var</span> translationWebRequest =<span style="color: #000000"&gt; HttpWebRequest.Create(uri);
translationWebRequest.Headers.Add(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;Ocp-Apim-Subscription-Key</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;,TEXT_TRANSLATION_API_SUBSCRIPTION_KEY);
WebResponse response </span>= <span style="color: #0000ff"&gt;null</span><span style="color: #000000"&gt;;
response </span>=<span style="color: #000000"&gt; translationWebRequest.GetResponse();

</span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 把返回的翻译结果抽取到 UI 控件中</span>
Stream stream =<span style="color: #000000"&gt; response.GetResponseStream();
StreamReader translatedStream </span>= <span style="color: #0000ff"&gt;new</span> StreamReader(stream,Encoding.GetEncoding(<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;utf-8</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;));
System.Xml.XmlDocument xmlResponse </span>= <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; System.Xml.XmlDocument();
xmlResponse.LoadXml(translatedStream.ReadToEnd());
TranslatedText.Text </span>=<span style="color: #000000"&gt; xmlResponse.InnerText;

}

调用翻译文本的 API 前,需要先从 UI 控件中取得用户设置的源语言和目标语言,并且还要对放在 url 中传输的文本内容进行编码:

uri = .Format(TEXT_TRANSLATION_API_ENDPOINT + ++ ,toLanguageCode);

函数中的:

(fromLanguageCode == = TextToTranslate.Text =

函数中:

CorrectSpelling( uri = BING_SPELL_CHECK_API_ENDPOINT + HttpWebRequest spellCheckWebRequest == = ; </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 把文本<a href="/tag/neirong/" target="_blank" class="keywords">内容</a>放在请求的 body 中</span> <span style="color: #0000ff"&gt;string</span> body = <span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;text=</span><span style="color: #800000"&gt;"</span> +<span style="color: #000000"&gt; System.Web.HttpUtility.UrlEncode(text); </span><span style="color: #0000ff"&gt;byte</span>[] data =<span style="color: #000000"&gt; Encoding.UTF8.GetBytes(body); spellCheckWebRequest.ContentLength </span>=<span style="color: #000000"&gt; data.Length; </span><span style="color: #0000ff"&gt;using</span> (<span style="color: #0000ff"&gt;var</span> requestStream =<span style="color: #000000"&gt; spellCheckWebRequest.GetRequestStream()) requestStream.Write(data,</span><span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;,data.Length); HttpWebResponse response </span>=<span style="color: #000000"&gt; (HttpWebResponse)spellCheckWebRequest.GetResponse(); </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 从返回中取出 json 格式的拼写检查结果</span> <span style="color: #0000ff"&gt;var</span> serializer = <span style="color: #0000ff"&gt;new</span><span style="color: #000000"&gt; System.Web.Script.Serialization.JavaScriptSerializer(); </span><span style="color: #0000ff"&gt;var</span> responseStream =<span style="color: #000000"&gt; response.GetResponseStream(); </span><span style="color: #0000ff"&gt;var</span> jsonString = <span style="color: #0000ff"&gt;new</span> StreamReader(responseStream,Encoding.GetEncoding(<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;utf-8</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;)).ReadToEnd(); </span><span style="color: #0000ff"&gt;dynamic</span> jsonResponse =<span style="color: #000000"&gt; serializer.DeserializeObject(jsonString); </span><span style="color: #0000ff"&gt;var</span> flaggedTokens = jsonResponse[<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;flaggedTokens</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;]; </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 我们定义一个规则来应用拼写检查的结果, </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 比如:当拼写检查的权值大于 0.7 时就用建议的值替换掉文本中的值。</span> <span style="color: #0000ff"&gt;var</span> corrections = <span style="color: #0000ff"&gt;new</span> SortedDictionary<<span style="color: #0000ff"&gt;int</span>,<span style="color: #0000ff"&gt;string</span>[]>(Comparer<<span style="color: #0000ff"&gt;int</span>>.Create((a,b) =><span style="color: #000000"&gt; b.CompareTo(a))); </span><span style="color: #0000ff"&gt;for</span> (<span style="color: #0000ff"&gt;int</span> i = <span style="color: #800080"&gt;0</span>; i < flaggedTokens.Length; i++<span style="color: #000000"&gt;) { </span><span style="color: #0000ff"&gt;var</span> correction =<span style="color: #000000"&gt; flaggedTokens[i]; </span><span style="color: #0000ff"&gt;var</span> suggestion = correction[<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;suggestions</span><span style="color: #800000"&gt;"</span>][<span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;]; </span><span style="color: #0000ff"&gt;if</span> (suggestion[<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;<a href="/tag/score/" target="_blank" class="keywords">score</a></span><span style="color: #800000"&gt;"</span>] > (<span style="color: #0000ff"&gt;decimal</span>)<span style="color: #800080"&gt;0.7</span><span style="color: #000000"&gt;) corrections[(</span><span style="color: #0000ff"&gt;int</span>)correction[<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;offset</span><span style="color: #800000"&gt;"</span>]] = <span style="color: #0000ff"&gt;new</span> <span style="color: #0000ff"&gt;string</span><span style="color: #000000"&gt;[] { correction[</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;token</span><span style="color: #800000"&gt;"</span>],suggestion[<span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;suggestion</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;] }; } </span><span style="color: #0000ff"&gt;foreach</span> (<span style="color: #0000ff"&gt;int</span> i <span style="color: #0000ff"&gt;in</span><span style="color: #000000"&gt; corrections.Keys) { </span><span style="color: #0000ff"&gt;var</span> oldtext = corrections[i][<span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;]; </span><span style="color: #0000ff"&gt;var</span> newtext = corrections[i][<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;]; </span><span style="color: #0000ff"&gt;if</span> (text.Substring(i,oldtext.Length).All(<span style="color: #0000ff"&gt;char</span>.IsUpper)) newtext =<span style="color: #000000"&gt; newtext.ToUpper(); </span><span style="color: #0000ff"&gt;else</span> <span style="color: #0000ff"&gt;if</span> (<span style="color: #0000ff"&gt;char</span>.IsUpper(text[i])) newtext = newtext[<span style="color: #800080"&gt;0</span>].ToString().ToUpper() + newtext.Substring(<span style="color: #800080"&gt;1</span><span style="color: #000000"&gt;); text </span>= text.Substring(<span style="color: #800080"&gt;0</span>,i) + newtext + text.Substring(i +<span style="color: #000000"&gt; oldtext.Length); } </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; text;

}

代码可以看出,拼写检查只是给出一些建议,具体怎么做还是由用户决定的。比如上面的代码中当拼写检查的权值大于 0.7 时就用建议的值替换掉文本中的值。下面我们来测试一下拼写检查的逻辑,运行程序,并输入 "helo world!" 进行翻译:

代码逻辑在检测到待翻译的语言为英语时,会先进行代码的拼写检查:

显示拼写检查函数 CorrectSpelling 纠正了我们的拼写错误,下面是翻译的结果:

代码的拼写检查,是不是感觉这个程序有点 "智能" 的味道啦!

猜你在找的Azure相关文章