LUIS的datetimeV2解析不一致(美国和英国格式)

时间:2019-01-24 13:05:29

标签: azure datetime luis

据我所知,LUIS仅在英语的美国文化中出现(没有英语)。因此,我希望datetimeV2实体返回为YYYY-DD-MM。但是 有时 LUIS会将datetimeV2实体作为YYYY-MM-DD发送回去,因此无法确定何时以编程方式发生这种情况。

示例:

话语“起飞时间从01/03/2019到04/03/2019”解析为美国YYYY-DD-MM格式:

[ { timex: '(2019-01-03,2019-04-03,P90D)',
    type: 'daterange',
    start: '2019-01-03',
    end: '2019-04-03' } ]

但是,话语“从2019年3月1日到2019年3月4日起飞”或“从2019年3月1日到2019年3月4日起飞”解析为英国YYYY-MM-DD格式:

[ { timex: '(2019-03-01,2019-03-04,P3D)',
    type: 'daterange',
    start: '2019-03-01',
    end: '2019-03-04' } ]

此外,如果当月份> 12时日期写为DD / MM / YYYY,则格式将再次切换为YYYY-MM-DD。例如。 “将起飞时间从01/03/2019更改为18/03/2019”将第一个日期解析为Y​​YYY-DD-MM,将第二个日期解析为Y​​YYY-MM-DD:

[ { timex: '(2019-01-03,2019-03-18,P74D)',
    type: 'daterange',
    start: '2019-01-03',
    end: '2019-03-18' } ]

如果格式不断更改,则很难解析日期。如何确保每个日期范围的格式都为YYYY-DD-MM?甚至YYYY-MM-DD,只要它 一致 ,或者至少告诉我它使用了什么格式,我都不会在意。

1 个答案:

答案 0 :(得分:0)

您的问题中有几点要注意。

第一个是关于前两个项目的:这里的评估有误:

  

话语权“从起飞时间01/03/2019到04/03/2019”决定为美国   YYYY-DD-MM格式:

[ { timex: '(2019-01-03,2019-04-03,P90D)',
    type: 'daterange',
    start: '2019-01-03',
    end: '2019-04-03' } ]

这里的分辨率不是美国(YYYY-DD-MM)格式,而是英国格式YYYY-MM-DD,因为如您所见,提到的持续时间为P90D:介于90天之间两个日期,所以3个月。


对于您的最后一项,原因有所不同。当您查看它的工作原理时,可以对此进行解释。在这种情况下,您必须了解此项目识别的工作原理:如您所见here,LUIS使用Microsoft.Recognizers.Text来从文本中提取此实体:

  

Microsoft.Recognizers.Text支持两个LUIS中的预建实体:   语言了解智能服务和Microsoft Bot   框架;并且还可以作为独立软件包使用(针对基础   类和不同的实体识别器)。

所有这些解决方案都是开源的,请访问https://github.com/Microsoft/Recognizers-Text,以便我们进行分析。

.Net版本中的可用区域性在此处列出:https://github.com/Microsoft/Recognizers-Text/blob/master/.NET/Microsoft.Recognizers.Text/Culture.cs

public const string English = "en-us";
public const string EnglishOthers = "en-*";
public const string Chinese = "zh-cn";
public const string Spanish = "es-es";
public const string Portuguese = "pt-br";
public const string French = "fr-fr";
public const string German = "de-de";
public const string Italian = "it-it";
public const string Japanese = "ja-jp";
public const string Dutch = "nl-nl";
public const string Korean = "ko-kr";

我使用识别器提供的Culture可能性(由于我不知道在LUIS中使用哪个English)进行了快速演示,以查看您的数据输出是什么: / p>

Recognizing 'take time off 01/03/2019 to 18/03/2019'

**English**

01/03/2019 to 18/03/2019
{
  "values": [
    {
      "timex": "(2019-01-03,2019-03-18,P74D)",
      "type": "daterange",
      "start": "2019-01-03",
      "end": "2019-03-18"
    }
  ]
}

**English Others**

01/03/2019 to 18/03/2019
{
  "values": [
    {
      "timex": "(2019-03-01,2019-03-18,P17D)",
      "type": "daterange",
      "start": "2019-03-01",
      "end": "2019-03-18"
    }
  ]
}

如您所见,我的第一个结果与您的结果相符,所以我想LUIS是基于English的文化,因此,en-US如果您是上面的人,那就是

基于此,您可以在实现中看到,对于美国版,它将尝试首先匹配YYYY-DD-MM,而YYYY-MM-DD是后备,因此句子的第1个日期使用第一次匹配(确认为1月3日),而第二个日期使用后备时间(确认为3月18日)