LUIS buitin datetime.v2实体无法解析日期范围类型的值

时间:2018-01-20 19:11:14

标签: c# botframework luis

我使用预先构建的datetime.v2实体来处理LUIS中所有与datetime相关的内容。

我有这句话:March to June 2017

LUIS的预期输出应该是实体:

"resolution": {
        "values": [
          {
            "timex": "XXXX-03",
            "type": "daterange",
            "start": "2017-03-01",
            "end": "2017-06-01"
          }
        ]
      }

但这是我在查询LUIS时得到的内容:

{
  "query": "march to june 2017",
  "topScoringIntent": {
    "intent": "TestIntent",
    "score": 1.0
  },
  "intents": [
    {
      "intent": "TestIntent",
      "score": 1.0
    },
    {
      "intent": "None",
      "score": 0.05487651
    }
  ],
  "entities": [
    {
      "entity": "march",
      "type": "builtin.datetimeV2.daterange",
      "startIndex": 0,
      "endIndex": 4,
      "resolution": {
        "values": [
          {
            "timex": "XXXX-03",
            "type": "daterange",
            "start": "2017-03-01",
            "end": "2017-04-01"
          },
          {
            "timex": "XXXX-03",
            "type": "daterange",
            "start": "2018-03-01",
            "end": "2018-04-01"
          }
        ]
      }
    },
    {
      "entity": "june 2017",
      "type": "builtin.datetimeV2.daterange",
      "startIndex": 9,
      "endIndex": 17,
      "resolution": {
        "values": [
          {
            "timex": "2017-06",
            "type": "daterange",
            "start": "2017-06-01",
            "end": "2017-07-01"
          }
        ]
      }
    }
  ]
}

我编写了以下C#代码,以查询我的LUIS意图中的日期范围

        [LuisIntent("TestIntent")]
        public async Task TestIntentHandler(IDialogContext context, LuisResult result)
        {
            EntityRecommendation dateTimeEntity, dateRangeEntity;
            if(result.TryFindEntity("builtin.datetimeV2.date", out dateTimeEntity))
            {
               var s = dateTimeEntity.Resolution.Values.Select(x => x).OfType<List<object>>().SelectMany(i => i).ToList();
            }
            if(result.TryFindEntity("builtin.datetimeV2.daterange", out dateRangeEntity))
            {
                var s = dateRangeEntity.Resolution.Values.Select(x => x).OfType<List<object>>().SelectMany(i => i).FirstOrDefault();
                var type = s.GetType();
            }
        }

任何人都可以告诉我如何使用预构建的datetime.v2类型的实体查询LUIS中的上述话语的月份范围。

1 个答案:

答案 0 :(得分:2)

我可以在我这边重现这个问题,但在我看来,3月(3/1到3月31日)是日期范围,6月(6/1到6/30)是日期范围,这很容易被认为是两个日期范围(正如LUIS所做的那样)。在this article中,它为我们提供了一个示例日期范围 可能是第二个到第五个 ,如果可能,请指定开始月份和结束月份的日期,例如 2017年3月1日至6月1日

enter image description here

此外,我检查了TryFindEntity的来源,发现它将 null FirstOrDefault 实体分配给EntityRecommendation entity,因此您的{{ 1}}将是第一个实体,即使LUIS返回两个实体(行军 2017年6月)。如果您在查询dateRangeEntity时要提取两个实体,请直接操作march to june 2017,而不是调用LuisResult result方法。

TryFindEntity 的源代码:

TryFindEntity