【问题标题】:LUIS inconsistent datetimeV2 parsing (US and UK formats)LUIS 不一致的 datetimeV2 解析(美国和英国格式)
【发布时间】:2019-01-24 13:05:29
【问题描述】:

据我所知,LUIS 仅出现在英语的 en-US 文化中(没有 en-UK)。因此,我希望 datetimeV2 实体以 YYYY-DD-MM 的形式返回。但是有时 LUIS 会以 YYYY-MM-DD 的形式发回 datetimeV2 实体,并且无法以编程方式判断这种情况何时发生。

例子:

“请假 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”解析为第一个日期为 YYYY-DD-MM,第二个日期为 YYYY-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,只要它一致或至少告诉我它使用了什么格式,我都不在乎。

【问题讨论】:

    标签: azure datetime azure-language-understanding


    【解决方案1】:

    您的问题有几点需要说明。

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

    “请假 2019 年 1 月 3 日至 2019 年 4 月 3 日”的表述解决为美国 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 中的预构建实体: 语言理解智能服务和微软机器人 框架;并且也可作为独立软件包提供(用于基础 类和不同的实体识别器)。

    所有这些解决方案都是开源的,在这里: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):

    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 月 3 日),而第二个日期使用后备(识别为 3 月 18 日)

    【讨论】:

    • 感谢 Nicolas - 我的第一点,我的意思是日期是这样解释的,而不是那样解决 - 请求是 3 月 1 日到 4 日,所以 3 天而不是 90 天。文化,我在 Node.js 中使用 LUIS 端点 API,因此基于话语创建查询字符串,例如westus.api.cognitive.microsoft.com/luis/v2.0/apps/… 2019 年 1 月 3 日至 2019 年 4 月 3 日休假&culture=en-。我尝试将文化设置为 en- 但无济于事,它只是被忽略了。你知道是否可以这样设置文化,还是我必须改变它的书写方式?
    • 不,没有办法像这样设置文化,文化是在 LUIS 应用程序中设置的(只有语言,没有国家代码)。对于第一点,是的,您在 DD/MM/YYYY 中的日期被解释为 MM/DD/YYYY,原因与我回答的最后一点相同:这取决于识别器源中的测试顺序......看起来像它在DD/MM/YYYY之前测试MM/DD/YYYY
    猜你喜欢
    • 2021-09-22
    • 2021-02-28
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多