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

Chr*_*hew 1 c# asp.net json botframework azure-language-understanding

通过 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
Run Code Online (Sandbox Code Playgroud)

这是访问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
Run Code Online (Sandbox Code Playgroud)

我了解这如何从 luis.ai 调用访问实体,但如何访问 json 响应的其他部分?

同样,是否有一种方法可以访问实体是否返回了一般的意图,例如布尔值响应?

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

Mat*_*ett 5

您是正确的,通过上述方法访问 JSON 并不理想。我会使用QuickType 之类的工具从 JSON 创建一个类,或者至少是您可以调整的类基础。然后,您可以使用 NewtonSoft JSON 库(或其他 JSON 库,因为您不想使用 NewtonSoft)将 JSON反序列化为一个对象并访问该对象的 Score 属性。

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

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


编辑

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

  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
Run Code Online (Sandbox Code Playgroud)
  1. 将生成的文件添加到 Visual Studio 中的项目。
    • 右键单击项目> 添加现有项目
  2. 在代码中使用生成的类:
var result = recognizer.Recognize<ClassToGenerate>("<user-input-text>", CancellationToken.None);
Run Code Online (Sandbox Code Playgroud)

  • 除了上述答案之外,如何使用 [LUISGen](https://github.com/microsoft/botbuilder-tools/blob/master/packages/LUISGen/src/npm/readme.md)。 (2认同)