LUIS несовместимый анализ datetimeV2 (форматы США и Великобритании) - PullRequest
0 голосов
/ 24 января 2019

Насколько я знаю, LUIS имеет только английскую культуру английского языка (нет en-UK). Поэтому я ожидаю, что объекты datetimeV2 вернутся как YYYY-DD-MM. Однако иногда LUIS отправляет обратно объекты datetimeV2 как YYYY-MM-DD, и невозможно определить, когда это происходит программно.

Пример:

Выражение «взять перерыв с 01.03.2009 по 03.03.2009» разрешается в формате США YYYY-DD-MM:

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

ОДНАКО высказывание «перерыв с 1 марта 2019 года по 4 марта 2019 года» или «перерыв с 1 марта 2019 года по 4 марта 2019 года» разрешается в формате UK YYYY-MM-DD:

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

Кроме того, если дата записывается как ДД / ММ / ГГГГ, когда месяц> 12, формат снова переключается на ГГГГ-ММ-ДД. Например. «Отключить время с 01/03/2019 по 18/03/2019»: первая дата обозначается как ГГГГ-ДД-ММ, а вторая дата - ГГГГ-ММ-ДД:

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

это очень затрудняет анализ дат, если форматы постоянно меняются. Как я могу убедиться, что каждый диапазон дат отформатирован как ГГГГ-ДД-ММ? Или даже ГГГГ-ММ-ДД, мне все равно, если он соответствует или, по крайней мере, говорит мне, какой формат он использовал.

1 Ответ

0 голосов
/ 25 января 2019

В вашем вопросе есть несколько моментов.

Первый из них касается первых двух пунктов: в вашей оценке здесь есть ошибка:

Изречение "взять перерыв с 01.03.2009 по 03.03.2009 », разрешается в формате США ГГГГ-ДД-ММ:

[ { 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 месяца.


Для вашего последнего элемента,причина в другом.Это можно объяснить, когда вы посмотрите, как это работает.В таких случаях вы должны понимать, как работает распознавание этих элементов: как вы можете видеть здесь , LUIS использует Microsoft.Recognizers.Text для извлечения этой сущности из текстов:

Microsoft.Recognizers.Text поддерживает готовые объекты в LUIS: Language Understanding Intelligent Service и Microsoft Bot Framework;и также доступен в виде отдельных пакетов (для базовых классов и различных распознавателей сущностей).

Все это решение с открытым исходным кодом, здесь: 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.по распознавателям (поскольку я не знаю, какой English используется в LUIS):

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"
    }
  ]
}

Как вы видите, мой 1-й результат совпадает с вашим, поэтому я предполагаю, что LUIS основан на Englishкультура, поэтому en-US, если вы смотрите выше.

Исходя из этого, в реализации вы можете видеть, что для версии для США она сначала пытается сопоставить YYYY-DD-MM и YYYY-MM-DD ​​- запасной вариант, поэтому 1-я дата вашего предложения использует 1-е совпадение (распознано как 3 января), тогда как 2-я дата использует запасной вариант (распознан как 18 марта)

...