.NET Core使用微软AI认知服务识别文字语言
點(diǎn)擊上方藍(lán)字關(guān)注“汪宇杰博客”
識(shí)別一段文字的語言有多種途徑,在這個(gè)以AI為熱點(diǎn)的時(shí)代,我們也可以給自己的應(yīng)用強(qiáng)行加上AI,然后就能加上“智慧”的名字“自主研發(fā)成功”后去吹牛逼。今天我?guī)Т蠹襾砜纯慈绾问褂梦④浿腔墼艫zure提供的AI認(rèn)知服務(wù)來識(shí)別一段文字的語言。
本文的前提條件是你得有一個(gè)Azure國(guó)際版的訂閱,免費(fèi)試用的也行。
新建Azure認(rèn)知服務(wù)賬戶
點(diǎn)擊"Create a resouce",然后搜索"Translator",選擇"Translator Text",這是Azure認(rèn)知服務(wù)的其中一種應(yīng)用,主要用途是做翻譯,但我們也能用來識(shí)別文字的語言。
在Name中指定一個(gè)名稱,可以任意,不影響程序開發(fā)。選擇一個(gè)Pricing tier,這里我選的F0是免費(fèi)的。Resource group也可以任意指定,不會(huì)影響程序開發(fā)。
創(chuàng)建完成后,到Keys中復(fù)制一個(gè)Key,Key1和Key2都可以使用,作用是完全一樣的,沒有什么講究。
.NET Core 調(diào)用認(rèn)知服務(wù)
Azure認(rèn)知服務(wù)提供了REST接口,所以我們?cè)?NET Core里可以像使用任何REST API一樣,構(gòu)造請(qǐng)求,并解析返回的JSON字符串。
TextLanguageDetector
新建一個(gè)名為TextLanguageDetector的類。用來封裝調(diào)用Azure認(rèn)知服務(wù)的操作。定義屬性Host、Route、SubscriptionKey。其中SubscriptionKey就是之前從Azure Portal里復(fù)制的那個(gè)Key。這個(gè)需要讓調(diào)用者根據(jù)自己的Azure賬戶自由調(diào)整,所以留在構(gòu)造函數(shù)參數(shù)里。Host和Route是固定的,因此可以寫死在程序里。
public class TextLanguageDetector
{
? ? public string Host { get; } = "https://api.cognitive.microsofttranslator.com";
? ? public string Route { get; } = "/detect?api-version=3.0";
? ? public string SubscriptionKey { get; }
? ? public TextLanguageDetector(string subscriptionKey)
? ? {
? ? ? ? SubscriptionKey = subscriptionKey;
? ? }
? ? public async Task<DetectResult> DetectAsync(string text)
? ? {
? ? ? ? // ...
? ? }
}
DetectAsync方法接受的是需要識(shí)別的文本,返回的DetectResult類型也是我們自己定義的,它的定義稍后再看。我們先看看該方法的具體實(shí)現(xiàn):
if (string.IsNullOrWhiteSpace(text))
{
? ? throw new ArgumentNullException(nameof(text));
}
object[] body = { new { Text = text } };
var requestBody = JsonConvert.SerializeObject(body);
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
? ? request.Method = HttpMethod.Post;
? ? request.RequestUri = new Uri(Host + Route);
? ? request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
? ? request.Headers.Add("Ocp-Apim-Subscription-Key", SubscriptionKey);
? ? var response = await client.SendAsync(request);
? ? var jsonResponse = await response.Content.ReadAsStringAsync();
? ? return new DetectResult(jsonResponse);
}
非常簡(jiǎn)明直接。使用POST動(dòng)作向認(rèn)知服務(wù)的終端地址提交一個(gè)構(gòu)造的Body,內(nèi)容Text為方法的輸入?yún)?shù),即要識(shí)別的文字。API的認(rèn)證方式使用SubscriptionKey。最終拿到的jsonResponse是識(shí)別結(jié)果,轉(zhuǎn)為DetectResult類型。
假設(shè)識(shí)別的是簡(jiǎn)體中文,并且沒有發(fā)生異常,那么Azure認(rèn)知服務(wù)的返回Json會(huì)是這樣:
[
? ? {
? ? ? ? "language": "zh-Hans",
? ? ? ? "score": 1.0,
? ? ? ? "isTranslationSupported": true,
? ? ? ? "isTransliterationSupported": true,
? ? ? ? "alternatives": [
? ? ? ? ? ? {
? ? ? ? ? ? ? ? "language": "ja",
? ? ? ? ? ? ? ? "score": 1.0,
? ? ? ? ? ? ? ? "isTranslationSupported": true,
? ? ? ? ? ? ? ? "isTransliterationSupported": true
? ? ? ? ? ? }
? ? ? ? ]
? ? }
]
language是語言代碼,zh-Hans就是簡(jiǎn)體中文。score表示AI認(rèn)為有多大的可能性是該語言,1.0就是非常確信。對(duì)于文本“予力地球上每一人、每一組織,成就不凡”的識(shí)別結(jié)果,出現(xiàn)了兩種確信的語言:簡(jiǎn)體中文和日語。但日語是alternatives的,所以AI基本斷定,該語言為簡(jiǎn)體中文。具體的語言代碼和語言名稱對(duì)應(yīng)關(guān)系可以從這里找到:
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
構(gòu)造DetectResult
為了讓我們程序?qū)φ{(diào)用者更加友好,我們不會(huì)只返回Json。我根據(jù)Azure認(rèn)知服務(wù)可能返回的兩種情況:成功、失敗,構(gòu)造了DetectResult類型:
public class DetectResult
{
? ? public string RawJson { get; set; }
? ? public bool IsSuccess => !RawJson.Contains("\"error\"");
? ? public string ErrorMessage
? ? {
? ? ? ? get
? ? ? ? {
? ? ? ? ? ? var obj = JsonConvert.DeserializeObject<dynamic>(RawJson);
? ? ? ? ? ? return obj.error.message.ToString();
? ? ? ? }
? ? }
? ? public DetectResult(string rawJson)
? ? {
? ? ? ? RawJson = rawJson;
? ? }
? ? public List<TextCogResult> ToCogResults()
? ? {
? ? ? ? return IsSuccess ? JsonConvert.DeserializeObject<List<TextCogResult>>(RawJson) : null;
? ? }
}
RawJson用來存放認(rèn)知服務(wù)返回的Json本身,可以讓調(diào)用者去做一些更加高級(jí)的自定義解析。IsSuccess表示調(diào)用是否有成功,如果不成功的話用戶可以檢查ErrorMessage獲得具體錯(cuò)誤消息。成功的話可以調(diào)用ToCogResults()方法把結(jié)果解析到TextCogResult類型里去。這個(gè)方法返回的是一個(gè)List,因?yàn)檩斎氲奈谋静灰欢ㄖ挥幸环N語言。
public class TextCogResult
{
? ? public string Language { get; set; }
? ? public float Score { get; set; }
? ? //public bool IsTranslationSupported { get; set; }
? ? //public bool IsTransliterationSupported { get; set; }
? ? public Alternative[] Alternatives { get; set; }
}
public class Alternative
{
? ? public string Language { get; set; }
? ? public float Score { get; set; }
? ? //public bool IsTranslationSupported { get; set; }
? ? //public bool IsTransliterationSupported { get; set; }
}
以上的所有代碼都可以封裝到一個(gè).NET Standard類庫(kù)里,這樣就可以跨.NET Framework, .NET Core或者Xamarin使用了。
為了方便大家,我已經(jīng)發(fā)布了可以直接使用的NuGet包
https://www.nuget.org/packages/AzureAILanguageDetector
應(yīng)用程序
以.NET Core控制臺(tái)應(yīng)用為例,調(diào)用TextLanguageDetector并輸出語言的本地名稱和英語名稱:
var texts = new[]
{
? ? "Empower every person and every organization on the planet to achieve more",
? ? "予力地球上每一人、每一組織,成就不凡"
};
var dt = new TextLanguageDetector("你的Key");
foreach (var text in texts)
{
? ? var result = dt.DetectAsync(text).Result;
? ? if (result.IsSuccess)
? ? {
? ? ? ? var r = result.ToCogResults();
? ? ? ? var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
? ? ? ? var ctr = cultures.FirstOrDefault(c => c.Name == r.First().Language);
? ? ? ? if (ctr != null) Console.WriteLine($"{ctr.EnglishName} - {ctr.NativeName}");
? ? }
? ? else
? ? {
? ? ? ? Console.WriteLine(result.ErrorMessage);
? ? }
}
本文示例代碼:https://github.com/EdiWang/DotNet-Samples/tree/master/CogSvcLngDetect
參考資料:https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-csharp-detect
總結(jié)
以上是生活随笔為你收集整理的.NET Core使用微软AI认知服务识别文字语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net Core跨平台应用研究-Hel
- 下一篇: asp.net ajax控件工具集 Au