Chatbot语言翻译:保存检测到的语言以进行响应翻译

如何解决Chatbot语言翻译:保存检测到的语言以进行响应翻译

我有一个聊天机器人正在实现翻译中间件。中间件检测输入的语言并将查询翻译成英语。我一直在努力将检测到的语言另存为变量,以将响应转换为用户的语言,但是遇到了障碍。

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext,CancellationToken cancellationToken)
        {
            var body = new object[] { new { Text = turnContext.Activity.Text } };
            var requestBody = JsonConvert.SerializeObject(body);

            //Console.WriteLine("------------------------------------------------------------------------");
            //Console.WriteLine(requestBody);
            //Console.WriteLine("------------------------------------------------------------------------");

            //var languageChoice = "de";
 
            using (var client = new HttpClient())
            using (var request = new HttpRequestMessage())
            {
                //var uri = "https://api.cognitive.microsofttranslator.com" + "/translate?api-version=3.0" + "&from=" + languageChoice + "&to=" + "en";
                var uri = "https://api.cognitive.microsofttranslator.com" + "/translate?api-version=3.0" + "&to=" + "en";

                request.Method = HttpMethod.Post;
                request.RequestUri = new Uri(uri);
                request.Content = new StringContent(requestBody,Encoding.UTF8,"application/json");

                request.Headers.Add("Ocp-Apim-Subscription-Key",_configuration["TranslatorKey"]);
                request.Headers.Add("Ocp-Apim-Subscription-Region","westus2");
 
                var translatedResponse = await client.SendAsync(request);
                var responseBody = await translatedResponse.Content.ReadAsstringAsync();
 
                Console.WriteLine("------------------------------------------------------------------------");
                Console.WriteLine(responseBody);
                Console.WriteLine("------------------------------------------------------------------------");

                var translation = JsonConvert.DeserializeObject<TranslatorResponse[]>(responseBody);
                var detectedLanguage = JsonConvert.DeserializeObject<DetectLanguage[]>(responseBody);

                var ourResponse = detectedLanguage?.FirstOrDefault()?.DetectedLanguage?.FirstOrDefault()?.Language.ToString();

                Console.WriteLine("------------------------------------------------------------------------");
                Console.WriteLine(ourResponse);
                Console.WriteLine("------------------------------------------------------------------------");
                
                //Console.WriteLine("------------------------------------------------------------------------");
                //Console.WriteLine(turnContext.Activity.Text);
                //Console.WriteLine(translation?.FirstOrDefault()?.Translations?.FirstOrDefault()?.Text.ToString());
                //Console.WriteLine("------------------------------------------------------------------------");
                
                // Update the translation field
                turnContext.Activity.Text = translation?.FirstOrDefault()?.Translations?.FirstOrDefault()?.Text.ToString();
            }

            // First,we use the dispatch model to determine which cognitive service (LUIS or QnA) to use.
            var recognizerResult = await _botServices.dispatch.RecognizeAsync(turnContext,cancellationToken);
            
            // Top intent tell us which cognitive service to use.
            var topIntent = recognizerResult.GetTopScoringIntent();
            
            // Next,we call the dispatcher with the top intent.
            // ***** ERROR *****
            await dispatchToTopIntentAsync(turnContext,topIntent.intent,recognizerResult,cancellationToken);
        }

使用responseBody中的控制台日志:

[{"detectedLanguage":{"language":"es","score":1.0},"translations":[{"text":"Hello","to":"en"}]}]

我们已确定responseBody是一个Object数组,其中包含属性“ detectedLanguage”,一个对象以及属性“ language”和“ score”。 为了从对象“ detectedLanguage”中检索变量“ language”,我们以“ turnContext.Activity.Text”作为翻译后的文本作为示例,进行了以下尝试。

我们还添加了两个内部类来模仿“ turnContext.Activity.Text”的实现:

1)

namespace Microsoft.BotBuilderSamples.Translation.Model
{
    /// <summary>
    /// Array of translated results from Translator API v3.
    /// </summary>
    internal class TranslatorResponse
    {
        [JsonProperty("translations")]
        public IEnumerable<TranslatorResult> Translations { get; set; }
    }
    internal class DetectLanguage
    {
        [JsonProperty("detectedLanguage")]
        public IEnumerable<LanguageResult> DetectedLanguage { get; set; }
    }
}
using Newtonsoft.Json;

namespace Microsoft.BotBuilderSamples.Translation.Model
{
    /// <summary>
    /// Translation result from Translator API v3.
    /// </summary>
    internal class TranslatorResult
    {
        [JsonProperty("text")]
        public string Text { get; set; }

        [JsonProperty("to")]
        public string To { get; set; }
    }
    internal class LanguageResult
    {
        [JsonProperty("language")]
        public string Language { get; set; }
    }
}

但是,当我们尝试在控制台中测试并显示“ ourResponse”时,会遇到以下错误消息:

fail: Microsoft.Bot.Builder.Integration.AspNet.Core.BotFrameworkHttpAdapter[0]
      [OnTurnError] unhandled error : Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.IEnumerable`1[Microsoft.BotBuilderSamples.Translation.Model.LanguageResult]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
      To fix this error either change the JSON to a JSON array (e.g. [1,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer,not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. 
      Path '[0].detectedLanguage.language',line 1,position 33.

我们确定我们正在遇到此错误,因为“ detectedLanguage”不是像“ translations”那样的数组。 (显示在下面的控制台输出中):

[{"detectedLanguage":{"language":"es","to":"en"}]}]

我的问题是我们如何调整该实现以使其与数组外部的detectedLanguage对象一起使用,或者如何调整将其包含在字符串中以与该实现一起使用?

解决方法

您的类结构与您的json不匹配。您想要的是以下内容:

internal class DetectedLanguage    
{
    [JsonProperty("language")]
    public string Language { get; set; }
    [JsonProperty("score")]
    public double Score { get; set; } 
}

internal class TranslatorResult
{
    [JsonProperty("text")]
    public string Text { get; set; }

    [JsonProperty("to")]
    public string To { get; set; }
}

internal class TranslatorResponse
{
    [JsonProperty("detectedLanguage")]
    public DetectedLanguage DetectedLanguage { get; set; } 
    [JsonProperty("translations")]
    public IEnumerable<TranslatorResult> Translations { get; set; } 
}

请注意,DetectedLanguage应该如何表示为TranslatorResponse对象上的单个对象,而您目前还没有这样做。另外,Language的{​​{1}}属性也是单个属性,而不是集合。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?