.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值