在 botframework v4 中使用 LUIS datetimeV2 实体

Working with LUIS datetimeV2 entities in botframework v4

我正在使用 Botframework v4 C# 和调度工具从 LUIS & QnA Maker 获取结果。 我的一些 LUIS 结果有 datetimev2 实体,我不太确定如何正确处理。

我在 AdditionalProperties 中看到已解析的日期时间值,是否有一个内置的 class 可以将此对象转换为?是否有任何示例可以解释如何在 botframework v4 中使用一般实体?所有与此相关的文档似乎仍然仅适用于 v3。

datetimeV2 很棘手,必须根据用户输入重构逻辑(有没有年份的日期、相对日期等)

处理日期时间的代码 (JS) 是:

const datetime = _.get(
          luisQuery.entities.filter(e => e.type && e.type.includes("builtin.datetimeV2")), 
          '[0].resolution.values[0].timex', 
          null);

const hasYear = (datetime) => {
    return !datetime.includes("XXXX");
};

const makeUseOfDateTime = (datetime) => {
    if (datetime.length === 4) {
        datetime += "-12-31";
    } else if (datetime.length === 7) {
        datetime += "-31";
    }

    // do something with datetime
};

hasYear 检查用户是否输入年份,makeUseOfDateTime 推断年末(如果只提供年)并推断月末(如果只提供年和月)

我最终 using these LuisResolutionExtensions 提取了日期时间值和一般的 LUIS 实体。

public static DateTime ProcessDateTimeV2Date(this EntityModel entity)
{
    if (entity.AdditionalProperties.TryGetValue("resolution", out dynamic resolution))
    {
        var resolutionValues = (IEnumerable<dynamic>) resolution.values;
        var datetimes = resolutionValues.Select(val => DateTime.Parse(val.value.Value));

        if (datetimes.Count() > 1)
        {
            // assume the date is in the next 7 days
            var bestGuess = datetimes.Single(dateTime => dateTime > DateTime.Now && (DateTime.Now - dateTime).Days <= 7);
            return bestGuess;
        }

        return datetimes.FirstOrDefault();
    }

    throw new Exception("ProcessDateTimeV2DateTime");
}

public static string ProcessRoom(this EntityModel entity)
{
    if (entity.AdditionalProperties.TryGetValue("resolution", out dynamic resolution))
    {
        var resolutionValues = (IEnumerable<dynamic>) resolution.values;
        return resolutionValues.Select(room => room).FirstOrDefault();
    }

    throw new Exception("ProcessRoom");
}