我正在使用预构建的实体datetimeV2来捕获日期范围。我用它来将它映射到两个不同的话语 - 本周,特别是在两个日期之间。如何在FormFlow模型中映射它?
我想做的就是这个 -
本周搜索所有航班
或
搜索今天至2017年10月7日之间的所有航班
准确捕获了LUIS实体,但无法将其映射到FormFlow模型 - 我的模型包含fromDate和ToDate。如何使用这些属性映射单个匹配的Luis实体?
答案 0 :(得分:0)
下面的代码说明了我为此提出的最佳解决方案。我仍在寻找更好的解决方案,并希望找到一个解决方案。您已经将datetime识别器nuget程序包添加到了解决方案中,并添加了适当的using语句。
using Microsoft.Recognizers.Text;
using Microsoft.Recognizers.Text.DateTime;
请注意turnContext.Activity.Text包含Luis正在解释的文本,即。 “上周”。
var culture = Culture.English;
var r = DateTimeRecognizer.RecognizeDateTime(turnContext.Activity.Text, culture);
if (r.Count > 0 && r.First().TypeName.StartsWith("datetimeV2"))
{
var first = r.First();
resolutionValues = (IList<Dictionary<string, string>>)first.Resolution["values"];
var asString = string.Join(";", resolutionValues[0]);
await turnContext.SendActivityAsync($"==>LUIS: resolutions values: {asString}\n");
var subType = first.TypeName.Split('.').Last();
if (subType.Contains("date") && !subType.Contains("range"))
{
// a date (or date & time) or multiple
var moment = resolutionValues.Select(v => DateTime.Parse(v["value"])).FirstOrDefault();
await turnContext.SendActivityAsync($"==>LUIS DateTime Moment: {moment}\n");
}
else if (subType.Contains("date") && subType.Contains("range"))
{
// range
var from = DateTime.Parse(resolutionValues.First()["start"]);
var to = DateTime.Parse(resolutionValues.First()["end"]);
await turnContext.SendActivityAsync($"==>LUIS DateTime Range: from: {from} to: {to}\n");
}
}
我在以下位置发布了该问题的更具体版本:Retrieve complete LUIS DateTimeV2 entity from recognizer