点击上方蓝字关注“汪宇杰博客”

识别一段文字的语言有多种途径,在这个以AI为热点的时代,我们也可以给自己的应用强行加上AI,然后就能加上“智慧”的名字“自主研发成功”后去吹牛逼。今天我带大家来看看如何使用微软智慧云Azure提供的AI认知服务来识别一段文字的语言。

本文的前提条件是你得有一个Azure国际版的订阅,免费试用的也行。

新建Azure认知服务账户

点击"Create a resouce",然后搜索"Translator",选择"Translator Text",这是Azure认知服务的其中一种应用,主要用途是做翻译,但我们也能用来识别文字的语言。

Name中指定一个名称,可以任意,不影响程序开发。选择一个Pricing tier,这里我选的F0是免费的。Resource group也可以任意指定,不会影响程序开发。

创建完成后,到Keys中复制一个Key,Key1Key2都可以使用,作用是完全一样的,没有什么讲究。

.NET Core 调用认知服务

Azure认知服务提供了REST接口,所以我们在.NET Core里可以像使用任何REST API一样,构造请求,并解析返回的JSON字符串。

TextLanguageDetector

新建一个名为TextLanguageDetector的类。用来封装调用Azure认知服务的操作。定义属性HostRouteSubscriptionKey。其中SubscriptionKey就是之前从Azure Portal里复制的那个Key。这个需要让调用者根据自己的Azure账户自由调整,所以留在构造函数参数里。HostRoute是固定的,因此可以写死在程序里。

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方法接受的是需要识别的文本,返回的DetectResult类型也是我们自己定义的,它的定义稍后再看。我们先看看该方法的具体实现:

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);

}

非常简明直接。使用POST动作向认知服务的终端地址提交一个构造的Body,内容Text为方法的输入参数,即要识别的文字。API的认证方式使用SubscriptionKey。最终拿到的jsonResponse是识别结果,转为DetectResult类型。

假设识别的是简体中文,并且没有发生异常,那么Azure认知服务的返回Json会是这样:

[

{

"language": "zh-Hans",

"score": 1.0,

"isTranslationSupported": true,

"isTransliterationSupported": true,

"alternatives": [

{

"language": "ja",

"score": 1.0,

"isTranslationSupported": true,

"isTransliterationSupported": true

}

]

}

]

language是语言代码,zh-Hans就是简体中文。score表示AI认为有多大的可能性是该语言,1.0就是非常确信。对于文本“予力地球上每一人、每一组织,成就不凡”的识别结果,出现了两种确信的语言:简体中文和日语。但日语是alternatives的,所以AI基本断定,该语言为简体中文。具体的语言代码和语言名称对应关系可以从这里找到:

var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);

构造DetectResult

为了让我们程序对调用者更加友好,我们不会只返回Json。我根据Azure认知服务可能返回的两种情况:成功、失败,构造了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用来存放认知服务返回的Json本身,可以让调用者去做一些更加高级的自定义解析。IsSuccess表示调用是否有成功,如果不成功的话用户可以检查ErrorMessage获得具体错误消息。成功的话可以调用ToCogResults()方法把结果解析到TextCogResult类型里去。这个方法返回的是一个List,因为输入的文本不一定只有一种语言。

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; }

}

以上的所有代码都可以封装到一个.NET Standard类库里,这样就可以跨.NET Framework, .NET Core或者Xamarin使用了。

为了方便大家,我已经发布了可以直接使用的NuGet包

https://www.nuget.org/packages/AzureAILanguageDetector

应用程序

以.NET Core控制台应用为例,调用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

.NET Core使用微软AI认知服务识别文字语言相关推荐

  1. 【微软 Azure 认知服务】零基础搭建微软 Azure AI 认知服务实验分享

    Azure人工智能认知服务实验 Azure认知服务(语音合成产品系列)是微软云服务里面的明星产品,基于行业领先的Hifi-net语音模型打造,可以提供高质量神经网络版声音,发音更准确.韵律更自然.高保 ...

  2. 微软认知服务开发实践(2) - 计算机视觉

    前言 计算机视觉所涉及的面很广泛,Computer Vision API中提供了几个常用的分析功能,可实现解读图片内容信息,对图片进行OCR识别,生成缩略图,未来也许会增加更多功能.本文将针对其分别是 ...

  3. 【0元试用微软 Azure人工智能认知服务】我做了个群聊天机器人

    前言 我这边参加了CSDN与微软Azure举办的0元试用微软Azure人工智能认知服务活动.第一次使用微软Azure 认知服务,老实说,还是满心期待的. 文章目录 前言 正式开始试用 环境 SDK的位 ...

  4. 人工智能第二课:认知服务和机器人框架探秘

    这是<人工智能系列笔记>的第二篇,我利用周六下午完成课程学习.这一方面是因为内容属于入门级,并且之前我已经对认知服务和机器人框架比较熟悉. 如有兴趣,请关注该系列 https://aka. ...

  5. 微软AI秀肌肉:Windows之后,用Azure收割市场

    ▼ 点击上方蓝字 关注网易智能 为你解读AI领域大公司大事件,新观点新应用 图:微软全球执行副总裁.微软人工智能及微软研究事业部负责人沈向洋 在Build 2018大会召开12天后,微软将其AI新战略 ...

  6. azure云服务使用方法_使用Azure认知服务自动执行表单处理

    azure云服务使用方法 由机器学习提供支持的 Microsoft认知服务是一种向您的应用程序添加人工智能的简便方法,使您可以按需付费,访问各种有用的算法 . 与许多其他Web服务不同,它们正在不断发 ...

  7. 【0元试用微软 Azure人工智能认知服务】这个人脸识别功能太强大啦

    导读:这个由美丽的客服小姐姐提前申请好了企业试用的账号,个人的话还得需要visa卡. 官网地址:azure.cn 登录地址:portal.azure.cn 目录 1.简介 2.Azure 认知服务是什 ...

  8. 微软认知服务应用秘籍 – 漫画翻译篇

    概述 微软认知服务包括了影像.语音.语言.搜索.知识五大领域,通过对这些认知服务的独立或者组合使用,可以解决很多现实世界中的问题.作为AI小白,我们可以选择艰难地攀登崇山峻岭,也可以选择像牛顿一样站在 ...

  9. 微软认知服务的使用 – 漫画翻译

    概述 微软认知服务包括了影像.语音.语言.搜索.知识五大领域,通过对这些认知服务的独立或者组合使用,可以解决很多现实世界中的问题.作为AI小白,我们可以选择艰难地攀登崇山峻岭,也可以选择像牛顿一样站在 ...

最新文章

  1. 每天学一点Scala之 伴生类和伴生对象
  2. java 中pc寄存器的作用_既然有PC寄存器,栈帧里的返回地址的作用是什么?
  3. 开发Activex控件安全
  4. oracle 对象管理 01_用户及权限
  5. Maven部署到Nexus
  6. 中国信通院金融科技负责人韩涵:大数据是生产资料的变革,区块链是生产关系的变革...
  7. Ubuntu下构建gstreamer开发环境
  8. Python中在脚本中引用其他文件函数的方法
  9. Python Day29 网络协议
  10. Solr6 快速入门教程
  11. C++11多线程 unique_lock详解
  12. 输入法分类总结与优缺点
  13. excel导入sqlsever
  14. 关于arctanx的麦克劳林展开式推导
  15. mysql数据库如何查看表空间_MYSQL:查看的数据库表空间
  16. 嵌入式Uboot,通过tftp进行内核镜像的加载及flash写入
  17. android 实现磨砂效果_Android(Android5.0)下毛玻璃(磨砂)效果如何实现?
  18. 解三元一次方程组的计算机,解三元一次方程组
  19. 基于ssm的高校二手物品交易网 java idea mysql
  20. js简繁转换,两种实现方式,妥妥的~

热门文章

  1. mailing list的原理
  2. mybatis源码学习(三):MappedStatement的解析过程
  3. Framework Design Studio 发布了
  4. JavaScript匿名函数以及在循环中的匿名函数
  5. zabbix JMX监控 tomcat
  6. 洛谷2296 寻找道路
  7. python3 UnicodeEncodeError: 'ascii' 错误
  8. Linux学习笔记 1 环境变量 2 vi命令
  9. Windows Server 2012 DHCP 服务器中的新功能:故障转移和策略
  10. android学习笔记之多线程(二)