如何在IRecognizerConvert中反序列化luis实体

问题描述 投票:0回答:1

在路易斯中,我用一个简单的实体创建了一个简单的图案,如下所示:

list bots {Name}

其中“名称”是我想在C#中获得的实体。模式和意图都可以正常工作,我可以正确地找到它。

我遵循官方示例并构建了IRecognizerConvert类,因此我可以反序列化结果。它可以很好地反序列化意图,但是不能反序列化实体。

在_Entities子类中,我只有要尝试反序列化的“名称”变量,而没有别的。我没有其他部分课程。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Bot.Builder;
using Newtonsoft.Json;
using Microsoft.Bot.Builder.AI.Luis;

namespace EmptyBot1.Models
{
    public class ChatbotIntent : IRecognizerConvert
    {
        public string Text;
        public string AlteredText;
        public enum Intent
        {
            CreateBot,
            ListBots,
            ListAllBots,
            RunBot,
            Cancel,
            Greet,
            None
        };
        public Dictionary<Intent, IntentScore> Intents;

        public class _Entities
        {
            public string Name;
        }
        public _Entities Entities;

        [JsonExtensionData(ReadData = true, WriteData = true)]
        public IDictionary<string, object> Properties { get; set; }

        public void Convert(dynamic result)
        {
            var _result = JsonConvert.DeserializeObject<ChatbotIntent>(JsonConvert.SerializeObject(result, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
            Text = _result.Text;
            AlteredText = _result.AlteredText;
            Intents = _result.Intents;
            Entities = _result.Entities;
            Properties = _result.Properties;
        }

        public (Intent intent, double score) TopIntent()
        {
            Intent maxIntent = Intent.None;
            var max = 0.0;
            foreach (var entry in Intents)
            {
                if (entry.Value.Score > max)
                {
                    maxIntent = entry.Key;
                    max = entry.Value.Score.Value;
                }
            }
            return (maxIntent, max);
        }
    }
}

在上一片段中,重要的部分是_Entities类,该类定义了从Luis返回时实体的外观。因为我只有1个简单的字符串实体“名称”,所以我认为这已经足够。

        public class _Entities
        {
            public string Name;
        }

但是,当我运行它时,却发出类似以下的声音:

"list bots mybots"

路易斯会正确分配Name =“ mybots”并获得正确的意图,但是它在JsonConvert.DeserializeObject行上崩溃,提示json格式不正确。我认为这是在抱怨我上的课吗?而且不是luis的实际JSON结果?

我需要在_Entities类中添加什么以便可以成功反序列化luis实体?

c# botframework luis
1个回答
0
投票

按照@ranusharao的建议,使用LUISGen工具,将自动生成与bot框架一起使用的类。

© www.soinside.com 2019 - 2024. All rights reserved.