Как я могу получить доступ к информации о баллах и существовании сущностей из метода luis.ai RecognizerAsync, который возвращает RecognizerResult - PullRequest
0 голосов
/ 30 мая 2019

Образец бота, созданный с помощью лазури, основан на этой документации

https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-luis?view=azure-bot-service-4.0&tabs=csharp

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

Вот пример json:

+       Entities    {{
  "$instance": {
    "To": [
      {
        "startIndex": 10,
        "endIndex": 15,
        "text": "paris",
        "type": "To",
        "score": 0.987954
      }
    ]
  },
  "To": [
    {
      "$instance": {
        "Airport": [
          {
            "startIndex": 10,
            "endIndex": 15,
            "text": "paris",
            "type": "Airport"
          }
        ]
      },
      "Airport": [
        [
          "Paris"
        ]
      ]
    }
  ]
}}  Newtonsoft.Json.Linq.JObject

Вот код доступа к json:

bookingDetails.Origin = recognizerResult.Entities["From"]?.FirstOrDefault()?["Airport"]?.FirstOrDefault()?.FirstOrDefault()?.ToString();

Я понимаю, как это обращается к сущности из вызова luis.ai, но как я могу получить доступ к другим частям ответа json?

Кроме того, есть ли способ доступа к тому, вернулся ли объект с целью в целом, такой как ответ, оцененный как bool?

Наконец, доступ к json в целом с помощью вышеуказанного метода кажется не идеальным. Есть ли более форматированный способ доступа к тому, что будет возвращать json, и с новым ядром asp.net 2+ есть ли способ сделать это без использования newtonsoft?

1 Ответ

2 голосов
/ 30 мая 2019

Вы правы, что доступ к JSON вышеописанным способом не идеален.Для этого я бы использовал такой инструмент, как QuickType , чтобы создать класс из JSON, или, по крайней мере, основу класса, который можно настроить .Затем вы можете использовать библиотеку JSON NewtonSoft (или альтернативную библиотеку JSON, поскольку вы не хотите использовать NewtonSoft), чтобы десериализовать JSON в объект и получить доступ к свойству Score объекта.

В качестве альтернативы, как показано в связанном руководстве, вы можете получить оценку из вызова метода GetTopScoringIntent.

Что касается проверки, были ли возвращены какие-либо объекты, вы можете подключить JSON, показанный в LUIS.Справочная страница API под ответом 200 к инструменту быстрого ввода, который я связал выше, чтобы создать класс, затем проверить коллекцию Entities, чтобы узнать, есть ли в ней какие-либо элементы - для этого можно использовать метод LINQs .Any().


Редактировать

Операция OP завершилась использованием LUISGen для вывода класса для десериализации ответа из API LUIS.

  1. Перейдите на портал LUIS.
  2. Перейдите в соответствующее приложение LUIS.
  3. Перейдите на вкладку Управление.
  4. Слева выберите элемент «Версии».
  5. Установите флажок рядом с версией, которую вы хотите экспортировать.
  6. В раскрывающемся списке выберите «Экспортировать как JSON».
  7. Сохраните JSON в корневой каталог вашего проекта.
  8. Откройте командную строку в корневом каталоге вашего проекта.
  9. Выполните следующие команды:
dotnet tool install -g LUISGen

LUISGen <exported-luis-app>.json -cs ClassToGenerate -o
Добавьте сгенерированный файл в ваш проект в Visual Studio.
  • Щелкните правой кнопкой мыши по проекту> Добавить существующий элемент
Использование сгенерированного класса в коде:
var result = recognizer.Recognize<ClassToGenerate>("<user-input-text>", CancellationToken.None);
...