LUIS buitin datetime.v2 实体无法解析 daterange 类型的值
LUIS buitin datetime.v2 entity unable to parse daterange type of values
我已经使用预构建的 datetime.v2 实体来处理 LUIS 中所有与日期时间相关的内容。
我有这样一句话: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 中查询月份范围,如上述语句。
我可以重现这个问题,但在我看来,3 月(3/1 到 3/31)是日期范围,6 月(6/1 到 6/30)是日期范围,这很容易被识别为两个日期范围(就像 LUIS 所做的那样)。在this article中,它给了我们一个示例日期范围5月2日至5月5日,如果可能,请指定起始月份的日期和结束月份,例如 2017 年 3 月 1 日至 6 月 1 日。
此外,我检查了 TryFindEntity
的来源,我发现它将 null 或 FirstOrDefault 实体分配给 EntityRecommendation entity
,所以你的 dateRangeEntity
将是第一个实体,即使 LUIS return 有两个实体(march 和 june 2017).如果在查询march to june 2017
时要提取两个实体,请直接操作LuisResult result
,不要调用TryFindEntity
方法。
TryFindEntity
的源代码:
// Microsoft.Bot.Builder.Luis.Extensions
public static bool TryFindEntity(this LuisResult result, string type, out EntityRecommendation entity)
{
IList<EntityRecommendation> expr_14 = result.Entities;
entity = ((expr_14 != null) ? expr_14.FirstOrDefault((EntityRecommendation e) => e.Type == type) : null);
return entity != null;
}
我已经使用预构建的 datetime.v2 实体来处理 LUIS 中所有与日期时间相关的内容。
我有这样一句话: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 中查询月份范围,如上述语句。
我可以重现这个问题,但在我看来,3 月(3/1 到 3/31)是日期范围,6 月(6/1 到 6/30)是日期范围,这很容易被识别为两个日期范围(就像 LUIS 所做的那样)。在this article中,它给了我们一个示例日期范围5月2日至5月5日,如果可能,请指定起始月份的日期和结束月份,例如 2017 年 3 月 1 日至 6 月 1 日。
此外,我检查了 TryFindEntity
的来源,我发现它将 null 或 FirstOrDefault 实体分配给 EntityRecommendation entity
,所以你的 dateRangeEntity
将是第一个实体,即使 LUIS return 有两个实体(march 和 june 2017).如果在查询march to june 2017
时要提取两个实体,请直接操作LuisResult result
,不要调用TryFindEntity
方法。
TryFindEntity
的源代码:
// Microsoft.Bot.Builder.Luis.Extensions
public static bool TryFindEntity(this LuisResult result, string type, out EntityRecommendation entity)
{
IList<EntityRecommendation> expr_14 = result.Entities;
entity = ((expr_14 != null) ? expr_14.FirstOrDefault((EntityRecommendation e) => e.Type == type) : null);
return entity != null;
}