使用预构建的实体datetimeV2捕获日期范围

时间:2017-07-06 16:33:34

标签: c# botframework

我正在使用预构建的实体datetimeV2来捕获日期范围。我用它来将它映射到两个不同的话语 - 本周,特别是在两个日期之间。如何在FormFlow模型中映射它?

我想做的就是这个 -

  

本周搜索所有航班

  

搜索今天至2017年10月7日之间的所有航班

准确捕获了LUIS实体,但无法将其映射到FormFlow模型 - 我的模型包含fromDate和ToDate。如何使用这些属性映射单个匹配的Luis实体?

1 个答案:

答案 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