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

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

640?wx_fmt=gif

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

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

640?wx_fmt=gif

新建Azure认知服务账户

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

    }

}

640?wx_fmt=png

本文示例代码:https://github.com/EdiWang/DotNet-Samples/tree/master/CogSvcLngDetect

参考资料:https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-csharp-detect

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020CCPC威海

2020CCPC威海 2020CCPC威海榜单 题号题目知识点难度AGolden Spirit思维&#xff0c;推导题签到题BLabyrinthdfs思维金牌题CRencontreDABC Conjecture数论&#xff0c;推导签到题ESo Many Possibilities…FSkeleton DynamizationGCaesar Cipher线段树hash银牌题HMessage Bomb贪…

P6118-[JOI 2019 Final]珍しい都市【树的直径】

正题 题目链接:https://www.luogu.com.cn/problem/P6118 题目大意 给出一棵nnn个点的树&#xff0c;对于一个点xxx来说&#xff0c;独特的点y(y≠x)y(y\neq x)y(y​x)是指不存在zzz使得dis(y,x)dis(z,x)dis(y,x)dis(z,x)dis(y,x)dis(z,x)&#xff0c;其中x≠z,y≠zx\neq z,…

[NOI2021 day1]轻重边(树链剖分),路径交点(矩阵行列式)

NOI 2021 day1轻重边descriptionsolutioncode路径交点descriptionsolutioncode轻重边 description solution case1~6 把父亲和儿子的边转化为储存在儿子上的点 建树&#xff0c;暴力爬lcalcalca&#xff0c;暴力修改&#xff0c;O(n2)O(n^2)O(n2) caseA 对于一条链的情况&am…

模板:CDQ分治

文章目录前言upd例题P3810 【模板】三维偏序&#xff08;陌上花开&#xff09;P2487 [SDOI2011]拦截导弹所谓CDQ分治&#xff0c;就是和由Conprour、Doctorjellyfish、QE添一同发明的分治算法 &#xff08;逃&#xff09; 前言 神奇的乱搞黑科技 CDQ分治能够通过更小的时间常…

【NET CORE微服务一条龙应用】第二章 配置中心使用

背景系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在分布式或者微服务系统里&#xff0c;通过配置文件来管理配置内容&#xff0c;是一件比较令人痛苦的事情&#xff0c;再谨慎也有湿鞋的时候&#xff0c;这就是在项目架构发展的过程中&#xff0c;配置中心存…

D - ABC Conjecture Gym - 102798D

D - ABC Conjecture Gym - 102798D 题意&#xff1a; 规定rad(n)n的所有质因子的乘积 给你一个c&#xff0c;问能否构造a和b使得abc且rad(abc)<c 题解&#xff1a; 先说结论&#xff0c;如果c可以拆分出两个一样的质因子&#xff0c;则能构造a和b 即 np1a1 * p2a2 . . .…

P7560-[JOISC 2021 Day1]フードコート【吉司机线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P7560 题目大意 有nnn个队列&#xff0c;要求支持操作&#xff1a; 往[L,R][L,R][L,R]的队列中插入kkk个ccc。出队[L,R][L,R][L,R]中的kkk个元素。&#xff08;如果不足kkk个就全部出队&#xff09;求第aaa个队列中的第bbb个…

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

刘德华 有一首歌叫《马桶》&#xff0c;其中有一句歌词是&#xff1a;每一个马桶都是英雄。EFCore也有一个英雄&#xff0c;在幕后默默地任劳任怨。它就叫 "支持字段" (Backing Fields):中文版&#xff1a;https://docs.microsoft.com/zh-cn/ef/core/modeling/backin…

P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)

解析 之前用KDtree做的一道题 由于懒不想再码一遍了 考虑CDQ分治 关键就是如何拿掉绝对值 如果只维护左下角的&#xff0c;显然就是一个经典的三维偏序问题了 但是本题不一定在左下角&#xff0c;也可能在左上、右下、右上 怎么办&#xff1f; 把坐标翻转翻转直接暴力做四遍即…

数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

[SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式&#xff0c;考虑化成等比数列 xi1ka(xik)a⋅xibt⇒kba−1x_{i1}ka(x_ik)ax_ibt\Rightarrow k\frac{b}{a-1}xi1​ka(xi​k)a⋅xi​bt⇒ka−1b​ ⇒xiba−1ai−1(x1ba−…

L - Clock Master Gym - 102798L

L - Clock Master Gym - 102798L 题意&#xff1a; 给定一个数字n&#xff0c;令na1a2a3…求lcm(a1,a2,a3,…)的最大值,以loge(x)的形式输出 题解&#xff1a; lcm要求尽可能大&#xff0c;我们就要保证a1,a2,a3…尽可能为质数或质数的整数次幂&#xff0c;我们假设a1是p1x…

P7739-[NOI2021]密码箱【Splay,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P7739 题目描述 懒得概括&#xff0c;摸了。 Yelekastee 是 U 国著名的考古学家。在最近的一次考古行动中&#xff0c;他发掘出了一个远古时期的密码箱。经过周密而严谨的考证&#xff0c;Yelekastee 得知密码箱的密码和某一…

NetCore下模拟和使用Modbus工业通信协议

Tips&#xff1a;1、目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net2、modbus是常用的工业通信协议&#xff0c;在软件调试时可以通过modbus pollslave模拟通信通过达到调试目的&#xff0c;下图是我使用软件1&#xff09…

codeforces:65

文章目录前言CF65A Harry Potter and Three SpellsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF65B Harry Potter and the History of MagicDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\…

C - Rencontre Gym - 102798C

C - Rencontre Gym - 102798C 参考题解&#xff1a; 参考一 参考二 题意&#xff1a; 有一棵树&#xff0c;树上的点分为三种&#xff0c;&#xff08;一个点可以为多种&#xff09;&#xff0c;现在分别在三种点中随机选一点a&#xff0c;b&#xff0c;c&#xff0c;然后找到…

API标准化成为技术团队面临的最大挑战

调查表明&#xff0c;API 标准化成为了技术团队面临的最大挑战。SmartBear 发布了 2019 年 API 状态报告“The State of API 2019”&#xff0c;此报告旨在为 API 行业建立关于软件团队在 2019 年规划、设计、开发、测试、记录和监控 API 的方法、实践和工具的基准。此次调查有…

线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

多类型高斯消元杂题[SDOI2010]外星千足虫descriptionsolutioncode[HNOI2013]游走descriptionsolutioncode[HNOI2011]XOR和路径descriptionsolutioncodeMaze(树上高斯消元)problemsolutioncode[SDOI2010]外星千足虫 description solution 高斯消元的模板题 虽然感觉问了个最…

P6117-[JOI 2019 Final]コイン集め【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P6117 题目大意 平面上有2n2n2n的硬币&#xff0c;要给每个硬币匹配一个x∈[1,n],y∈[1,2]x\in[1,n],y\in[1,2]x∈[1,n],y∈[1,2]的位置&#xff08;不能重复&#xff09;。 使得所有硬币和它们匹配位置的曼哈顿距离之和最小…

CF788789(div1div2)

文章目录前言CF789A Anastasia and pebblesDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF789B Masha and geometric depressionDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}Cod…

【HDU-2376】Average distance

【HDU-2376】Average distance 题意&#xff1a; 给你一个树&#xff0c;求树上任意两个点之间的距离的平均值 题解&#xff1a; 就是求出任意两点之间的距离和然后除以边数 ”任意两点之间的距离“ 和怎么算&#xff1f; 我们去考虑边的贡献情况&#xff1a; 对于边(u,v)&…