我使用预先构建的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中的上述话语的月份范围。
答案 0 :(得分:2)
我可以在我这边重现这个问题,但在我看来,3月(3/1到3月31日)是日期范围,6月(6/1到6/30)是日期范围,这很容易被认为是两个日期范围(正如LUIS所做的那样)。在this article中,它为我们提供了一个示例日期范围 可能是第二个到第五个 ,如果可能,请指定开始月份和结束月份的日期,例如 2017年3月1日至6月1日 。
此外,我检查了TryFindEntity
的来源,发现它将 null 或 FirstOrDefault 实体分配给EntityRecommendation entity
,因此您的{{ 1}}将是第一个实体,即使LUIS返回两个实体(行军和 2017年6月)。如果您在查询dateRangeEntity
时要提取两个实体,请直接操作march to june 2017
,而不是调用LuisResult result
方法。
TryFindEntity
的源代码:
TryFindEntity