Как десериализовать сущность luis в IRecognizerConvert - PullRequest
0 голосов
/ 18 января 2020

В Луисе я создал простой шаблон с простой сущностью, такой как:

list bots {Name}

, где «Имя» - это моя сущность, которую я хотел бы получить в C#. Шаблон и намерение работают нормально, и я получаю это правильно.

Я следую официальному примеру и создал класс IRecognizerConvert, чтобы я мог десериализовать результат. Он просто десериализует намерение, но не может десериализовать сущность.

В подклассе _Entities у меня есть только переменная "Name", которую я пытаюсь десериализовать, и ничего больше. У меня нет другого частичного класса.

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, который определяет, как выглядят сущности, возвращающиеся из Луиса. Так как у меня есть только 1 простая строковая сущность «Имя», я подумал, что этого достаточно.

        public class _Entities
        {
            public string Name;
        }

Однако, когда я запускаю его, я даю ему следующее высказывание:

"list bots mybots"

Луис будет правильно назначать Name = "mybots" и получит правильное намерение, но в строке JsonConvert.DeserializeObject указано sh, говорящее о неправильном формате json. Я предполагаю, что это жалуется на класс, который я сделал? А не фактический JSON результат от luis?

Что мне нужно добавить в класс _Entities, чтобы сущность luis могла быть успешно десериализирована?

1 Ответ

0 голосов
/ 24 января 2020

В соответствии с рекомендациями @ranusharao, используя инструмент LUISGen, автоматически генерируется класс, который работает с каркасом бота.

...