在 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");
}
我正在使用 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");
}