如何从 returns RecognizerResult 的 luis.ai RecognizerAsync 方法访问实体得分信息和/或存在

How can I access an entities score information and or existence from the luis.ai RecognizerAsync method which returns the RecognizerResult

通过 azure 构建的示例机器人基于此文档

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

我正在尝试重构对话框的部分功能,我需要访问我认为应该从 luis 调用返回的 json 部分。但是,当我尝试从 $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 响应的其他部分?

还有,有没有一种方法可以访问实体是否出于一般意图(例如布尔值响应)而返回?

最后,通过上述方法访问json一般情况下似乎不太理想。有没有一种更格式化的方式来访问 json return 和新的 asp.net core 2+ 有没有办法在不使用 newtonsoft 的情况下做到这一点?

你是对的,通过上述方法访问 JSON 并不理想。我会做的是使用 QuickType to create a class from JSON, or at least the basis of a class that you can tweak. You can then use the NewtonSoft JSON library (or an alternative JSON library since you don't want to use NewtonSoft) to Deserialize 之类的工具将 JSON 放入对象中并访问对象的分数 属性。

或者,如您链接的指南中所示,您可以从 GetTopScoringIntent 方法调用中获取分数。

关于检查是否返回了任何实体,您可以将 200 响应下 LUIS API reference 页面上显示的 JSON 插入我在上面链接的快速输入工具中,然后创建一个 class检查 Entities 集合以查看它是否有任何项目 - 您可以为此使用 LINQs .Any() 方法。


编辑

OP 最终使用 LUISGen 输出 class 来反序列化来自 LUIS API 的响应。

  1. 转到 LUIS 门户。
  2. 导航到相关的 LUIS 应用。
  3. 转到“管理”选项卡。
  4. 在左侧,select 版本项。
  5. 选中要导出的版本旁边的复选框。
  6. 从下拉列表中,select 导出为 JSON。
  7. 将 JSON 保存到项目的根目录中。
  8. 在项目的根目录中打开命令提示符。
  9. 运行 以下命令:
dotnet tool install -g LUISGen

LUISGen <exported-luis-app>.json -cs ClassToGenerate -o
  1. 将生成的文件添加到 Visual Studio 中的项目中。
    • 右键单击项目 > 添加现有项目
  2. 在代码中使用生成的class:
var result = recognizer.Recognize<ClassToGenerate>("<user-input-text>", CancellationToken.None);