From 544bd95e8a5d490fe26d26c558c00aef15d85613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=B6rje=20Karlsson?= Date: Wed, 9 Jan 2019 10:07:33 +0800 Subject: [PATCH] Fix build break caused by incorrect merge and re-gen resources. (#1231) --- .../English/DateTimeDefinitions.cs | 2 + .../Parsers/BaseMergedDateTimeParser.cs | 30 +++--- .../datetime/resources/EnglishDateTime.java | 2 + .../text/number/resources/SpanishNumeric.java | 97 ++++++++++++++++++- .../tests/datetime/DateTimeExtractorTest.java | 3 +- .../src/resources/englishDateTime.ts | 4 +- Patterns/English/English-DateTime.yaml | 2 + .../resources/english_date_time.py | 2 + 8 files changed, 126 insertions(+), 16 deletions(-) diff --git a/.NET/Microsoft.Recognizers.Definitions.Common/English/DateTimeDefinitions.cs b/.NET/Microsoft.Recognizers.Definitions.Common/English/DateTimeDefinitions.cs index 05f7055447..6e3cbc5843 100644 --- a/.NET/Microsoft.Recognizers.Definitions.Common/English/DateTimeDefinitions.cs +++ b/.NET/Microsoft.Recognizers.Definitions.Common/English/DateTimeDefinitions.cs @@ -625,6 +625,7 @@ public static class DateTimeDefinitions public static readonly Dictionary SpecialDecadeCases = new Dictionary { { @"noughties", 2000 }, + { @"aughts", 2000 }, { @"two thousands", 2000 } }; public const string DefaultLanguageFallback = @"MDY"; @@ -640,6 +641,7 @@ public static class DateTimeDefinitions public static readonly Dictionary AmbiguityFiltersDict = new Dictionary { { @"\bmorning|afternoon|evening|night|day\b", @"\b(good\s+(morning|afternoon|evening|night|day))|(nighty\s+night)\b" }, + { @"\bnow\b", @"\b(^now,)|\b((is|are)\s+now\s+for|for\s+now)\b" }, { @"\bmay\b", @"\b((^may i)|(i|you|he|she|we|they)\s+may|(may\s+((((also|not|(also not)|well)\s+)?(be|ask|contain|constitute|email|e-mail|take|have|result|involve|get|work|reply))|(or may not))))\b" } }; public static readonly IList MorningTermList = new List diff --git a/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedDateTimeParser.cs b/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedDateTimeParser.cs index 968f3481f2..60d90cad99 100644 --- a/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedDateTimeParser.cs +++ b/.NET/Microsoft.Recognizers.Text.DateTime/Parsers/BaseMergedDateTimeParser.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Globalization; +using System.Linq; using DateObject = System.DateTime; namespace Microsoft.Recognizers.Text.DateTime @@ -92,7 +92,8 @@ public DateTimeParseResult Parse(ExtractResult er, DateObject refTime) er.Text = er.Text.Substring(aroundMatch.Length); modStr = aroundMatch.Value; } - else if ((er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD) && Config.YearRegex.Match(er.Text).Success) || (er.Type.Equals(Constants.SYS_DATETIME_DATE))) + else if ((er.Type.Equals(Constants.SYS_DATETIME_DATEPERIOD) && Config.YearRegex.Match(er.Text).Success) || + er.Type.Equals(Constants.SYS_DATETIME_DATE)) { // This has to be put at the end of the if, or cases like "before 2012" and "after 2012" would fall into this // 2012 or after/above @@ -228,9 +229,12 @@ public DateTimeParseResult Parse(ExtractResult er, DateObject refTime) } if ((Config.Options & DateTimeOptions.SplitDateAndTime) != 0 && - ((DateTimeResolutionResult)pr.Value)?.SubDateTimeEntities != null) + ((DateTimeResolutionResult)pr?.Value)?.SubDateTimeEntities != null) { - pr.Value = DateTimeResolutionForSplit(pr); + if (pr != null) + { + pr.Value = DateTimeResolutionForSplit(pr); + } } else { @@ -241,7 +245,7 @@ public DateTimeParseResult Parse(ExtractResult er, DateObject refTime) // In this version, ExperimentalMode only cope with the "IncludePeriodEnd" case if ((this.Config.Options & DateTimeOptions.ExperimentalMode) != 0) { - if (pr.Metadata != null && pr.Metadata.PossiblyIncludePeriodEnd) + if (pr?.Metadata != null && pr.Metadata.PossiblyIncludePeriodEnd) { pr = SetInclusivePeriodEnd(pr); } @@ -289,7 +293,8 @@ public DateTimeParseResult SetInclusivePeriodEnd(DateTimeParseResult slot) foreach (var values in valueSet) { // This is only a sanity check, as here we only handle DatePeriod like "(StartDate,EndDate,Duration)" - if (values.ContainsKey(DateTimeResolutionKey.START) && values.ContainsKey(DateTimeResolutionKey.END) && values.ContainsKey(DateTimeResolutionKey.Timex)) + if (values.ContainsKey(DateTimeResolutionKey.START) && values.ContainsKey(DateTimeResolutionKey.END) && + values.ContainsKey(DateTimeResolutionKey.Timex)) { var startDate = DateObject.Parse(values[DateTimeResolutionKey.START]); var endDate = DateObject.Parse(values[DateTimeResolutionKey.END]); @@ -297,7 +302,8 @@ public DateTimeParseResult SetInclusivePeriodEnd(DateTimeParseResult slot) var datePeriodTimexType = TimexUtility.GetDatePeriodTimexType(durationStr); endDate = TimexUtility.OffsetDateObject(endDate, offset: 1, timexType: datePeriodTimexType); values[DateTimeResolutionKey.END] = DateTimeFormatUtil.LuisDate(endDate); - values[DateTimeResolutionKey.Timex] = GenerateEndInclusiveTimex(slot.TimexStr, datePeriodTimexType, startDate, endDate); + values[DateTimeResolutionKey.Timex] = + GenerateEndInclusiveTimex(slot.TimexStr, datePeriodTimexType, startDate, endDate); if (string.IsNullOrEmpty(altTimex)) { @@ -316,8 +322,10 @@ public DateTimeParseResult SetInclusivePeriodEnd(DateTimeParseResult slot) return slot; } - public string GenerateEndInclusiveTimex(string originalTimex, DatePeriodTimexType datePeriodTimexType, DateObject startDate, DateObject endDate) + public string GenerateEndInclusiveTimex(string originalTimex, DatePeriodTimexType datePeriodTimexType, + DateObject startDate, DateObject endDate) { + var timexEndInclusive = TimexUtility.GenerateDatePeriodTimex(startDate, endDate, datePeriodTimexType); // Sometimes the original timex contains fuzzy part like "XXXX-05-31" @@ -762,7 +770,7 @@ public void AddAltPeriodToResolution(Dictionary resolutionDic, s } public void AddAltSingleDateTimeToResolution(Dictionary resolutionDic, string type, string mod, - Dictionary res) + Dictionary res) { if (resolutionDic.ContainsKey(TimeTypeConstants.DATE)) { @@ -780,7 +788,7 @@ public void AddAltPeriodToResolution(Dictionary resolutionDic, s } public void AddSingleDateTimeToResolution(Dictionary resolutionDic, string type, string mod, - Dictionary res) + Dictionary res) { if (resolutionDic.ContainsKey(type) && !resolutionDic[type].Equals(DateMinString) && !resolutionDic[type].Equals(DateTimeMinString)) @@ -818,7 +826,7 @@ public void AddAltPeriodToResolution(Dictionary resolutionDic, s } public void AddPeriodToResolution(Dictionary resolutionDic, string startType, string endType, - string mod, Dictionary res) + string mod, Dictionary res) { var start = ""; var end = ""; diff --git a/Java/libraries/recognizers-text-date-time/src/main/java/com/microsoft/recognizers/text/datetime/resources/EnglishDateTime.java b/Java/libraries/recognizers-text-date-time/src/main/java/com/microsoft/recognizers/text/datetime/resources/EnglishDateTime.java index 61de648a93..7cb4c9ba60 100644 --- a/Java/libraries/recognizers-text-date-time/src/main/java/com/microsoft/recognizers/text/datetime/resources/EnglishDateTime.java +++ b/Java/libraries/recognizers-text-date-time/src/main/java/com/microsoft/recognizers/text/datetime/resources/EnglishDateTime.java @@ -1194,6 +1194,7 @@ public class EnglishDateTime { public static final ImmutableMap SpecialDecadeCases = ImmutableMap.builder() .put("noughties", 2000) + .put("aughts", 2000) .put("two thousands", 2000) .build(); @@ -1205,6 +1206,7 @@ public class EnglishDateTime { public static final ImmutableMap AmbiguityFiltersDict = ImmutableMap.builder() .put("\\bmorning|afternoon|evening|night|day\\b", "\\b(good\\s+(morning|afternoon|evening|night|day))|(nighty\\s+night)\\b") + .put("\\bnow\\b", "\\b(^now,)|\\b((is|are)\\s+now\\s+for|for\\s+now)\\b") .put("\\bmay\\b", "\\b((^may i)|(i|you|he|she|we|they)\\s+may|(may\\s+((((also|not|(also not)|well)\\s+)?(be|ask|contain|constitute|email|e-mail|take|have|result|involve|get|work|reply))|(or may not))))\\b") .build(); diff --git a/Java/libraries/recognizers-text-number/src/main/java/com/microsoft/recognizers/text/number/resources/SpanishNumeric.java b/Java/libraries/recognizers-text-number/src/main/java/com/microsoft/recognizers/text/number/resources/SpanishNumeric.java index 44384c8148..0dd620b353 100644 --- a/Java/libraries/recognizers-text-number/src/main/java/com/microsoft/recognizers/text/number/resources/SpanishNumeric.java +++ b/Java/libraries/recognizers-text-number/src/main/java/com/microsoft/recognizers/text/number/resources/SpanishNumeric.java @@ -30,9 +30,9 @@ public class SpanishNumeric { public static final String TensNumberIntegerRegex = "(cincuenta|cuarenta|treinta|sesenta|setenta|ochenta|noventa)"; - public static final String NegativeNumberTermsRegex = "^[.]"; + public static final String NegativeNumberTermsRegex = "((?)"; + + public static final String LessRegex = "((menos|menor|menores|por\\s+debajo)(\\s+(que|de|del))?|más\\s+baj[oa]\\s+que|(?|=)<)"; + + public static final String EqualRegex = "((igual(es)?|equivalente(s)?|equivale|equivalen|son)(\\s+(a|que|de|al|del))?|(?)=)"; + + public static final String MoreOrEqualPrefix = "((no\\s+{LessRegex})|(por\\s+lo\\s+menos|como\\s+m[íi]nimo|al\\s+menos))" + .replace("{LessRegex}", LessRegex); + + public static final String MoreOrEqual = "(({MoreRegex}\\s+(o)?\\s+{EqualRegex})|({EqualRegex}\\s+(o|y)\\s+{MoreRegex})|{MoreOrEqualPrefix}(\\s+(o)\\s+{EqualRegex})?|({EqualRegex}\\s+(o)\\s+)?{MoreOrEqualPrefix}|>\\s*=)" + .replace("{MoreRegex}", MoreRegex) + .replace("{EqualRegex}", EqualRegex) + .replace("{LessRegex}", LessRegex) + .replace("{MoreOrEqualPrefix}", MoreOrEqualPrefix); + + public static final String MoreOrEqualSuffix = "((\\b(y|o)\\b\\s+(m[áa]s|mayor|mayores)((?!\\s+(alt[oa]|baj[oa]|que|de|del))|(\\s+(que|de|del)(?!(\\s*\\d+)))))|como\\s+m[áa]ximo|por\\s+lo\\s+menos|al\\s+menos)"; + + public static final String LessOrEqualPrefix = "((no\\s+{MoreRegex})|(como\\s+máximo|como\\s+maximo|como\\s+mucho))" + .replace("{MoreRegex}", MoreRegex); + + public static final String LessOrEqual = "(({LessRegex}\\s+(o)?\\s+{EqualRegex})|({EqualRegex}\\s+(o)?\\s+{LessRegex})|{LessOrEqualPrefix}(\\s+(o)?\\s+{EqualRegex})?|({EqualRegex}\\s+(o)?\\s+)?{LessOrEqualPrefix}|<\\s*=)" + .replace("{LessRegex}", LessRegex) + .replace("{EqualRegex}", EqualRegex) + .replace("{MoreRegex}", MoreRegex) + .replace("{LessOrEqualPrefix}", LessOrEqualPrefix); + + public static final String LessOrEqualSuffix = "((\\b(y|o)\\b\\s+(menos|menor|menores)((?!\\s+(alt[oa]|baj[oa]|que|de|del))|(\\s+(que|de|del)(?!(\\s*\\d+)))))|como\\s+m[íi]nimo)"; + + public static final String NumberSplitMark = "(?![,.](?!\\d+))"; + + public static final String MoreRegexNoNumberSucceed = "((m[áa]s|mayor|mayores)((?!\\s+(que|de|del))|\\s+((que|de|del)(?!(\\s*\\d+))))|(por encima)(?!(\\s*\\d+)))"; + + public static final String LessRegexNoNumberSucceed = "((menos|menor|menores)((?!\\s+(que|de|del))|\\s+((que|de|del)(?!(\\s*\\d+))))|(por debajo)(?!(\\s*\\d+)))"; + + public static final String EqualRegexNoNumberSucceed = "((igual|iguales|equivalente|equivalentes|equivale|equivalen)((?!\\s+(a|que|de|al|del))|(\\s+(a|que|de|al|del)(?!(\\s*\\d+)))))"; + + public static final String OneNumberRangeMoreRegex1 = "({MoreOrEqual}|{MoreRegex})\\s*((el|la|los|las)\\s+)?(?({NumberSplitMark}.)+)" + .replace("{MoreOrEqual}", MoreOrEqual) + .replace("{MoreRegex}", MoreRegex) + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String OneNumberRangeMoreRegex2 = "(?({NumberSplitMark}.)+)\\s*{MoreOrEqualSuffix}" + .replace("{MoreOrEqualSuffix}", MoreOrEqualSuffix) + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String OneNumberRangeMoreSeparateRegex = "({EqualRegex}\\s+(?({NumberSplitMark}.)+)(\\s+o\\s+){MoreRegexNoNumberSucceed})|({MoreRegex}\\s+(?({NumberSplitMark}.)+)(\\s+o\\s+){EqualRegexNoNumberSucceed})" + .replace("{EqualRegex}", EqualRegex) + .replace("{MoreRegex}", MoreRegex) + .replace("{EqualRegexNoNumberSucceed}", EqualRegexNoNumberSucceed) + .replace("{MoreRegexNoNumberSucceed}", MoreRegexNoNumberSucceed) + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String OneNumberRangeLessRegex1 = "({LessOrEqual}|{LessRegex})\\s*((el|la|los|las)\\s+)?(?({NumberSplitMark}.)+)" + .replace("{LessOrEqual}", LessOrEqual) + .replace("{LessRegex}", LessRegex) + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String OneNumberRangeLessRegex2 = "(?({NumberSplitMark}.)+)\\s*{LessOrEqualSuffix}" + .replace("{LessOrEqualSuffix}", LessOrEqualSuffix) + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String OneNumberRangeLessSeparateRegex = "({EqualRegex}\\s+(?({NumberSplitMark}.)+)(\\s+o\\s+){LessRegexNoNumberSucceed})|({LessRegex}\\s+(?({NumberSplitMark}.)+)(\\s+o\\s+){EqualRegexNoNumberSucceed})" + .replace("{EqualRegex}", EqualRegex) + .replace("{LessRegex}", LessRegex) + .replace("{EqualRegexNoNumberSucceed}", EqualRegexNoNumberSucceed) + .replace("{LessRegexNoNumberSucceed}", LessRegexNoNumberSucceed) + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String OneNumberRangeEqualRegex = "{EqualRegex}\\s*((el|la|los|las)\\s+)?(?({NumberSplitMark}.)+)" + .replace("{EqualRegex}", EqualRegex) + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String TwoNumberRangeRegex1 = "entre\\s*((el|la|los|las)\\s+)?(?({NumberSplitMark}.)+)\\s*y\\s*((el|la|los|las)\\s+)?(?({NumberSplitMark}.)+)" + .replace("{NumberSplitMark}", NumberSplitMark); + + public static final String TwoNumberRangeRegex2 = "({OneNumberRangeMoreRegex1}|{OneNumberRangeMoreRegex2})\\s*(\\by\\b|\\be\\b|pero|,)\\s*({OneNumberRangeLessRegex1}|{OneNumberRangeLessRegex2})" + .replace("{OneNumberRangeMoreRegex1}", OneNumberRangeMoreRegex1) + .replace("{OneNumberRangeMoreRegex2}", OneNumberRangeMoreRegex2) + .replace("{OneNumberRangeLessRegex1}", OneNumberRangeLessRegex1) + .replace("{OneNumberRangeLessRegex2}", OneNumberRangeLessRegex2); + + public static final String TwoNumberRangeRegex3 = "({OneNumberRangeLessRegex1}|{OneNumberRangeLessRegex2})\\s*(\\by\\b|\\be\\b|pero|,)\\s*({OneNumberRangeMoreRegex1}|{OneNumberRangeMoreRegex2})" + .replace("{OneNumberRangeMoreRegex1}", OneNumberRangeMoreRegex1) + .replace("{OneNumberRangeMoreRegex2}", OneNumberRangeMoreRegex2) + .replace("{OneNumberRangeLessRegex1}", OneNumberRangeLessRegex1) + .replace("{OneNumberRangeLessRegex2}", OneNumberRangeLessRegex2); + + public static final String TwoNumberRangeRegex4 = "((de|desde)\\s+)?((el|la|los|las)\\s+)?(?({NumberSplitMark}(?!\\b(entre|de|desde|es)\\b).)+)\\s*{TillRegex}\\s*((el|la|los|las)\\s+)?(?({NumberSplitMark}.)+)" + .replace("{TillRegex}", TillRegex) + .replace("{NumberSplitMark}", NumberSplitMark); + public static final Character DecimalSeparatorChar = ','; public static final String FractionMarkerToken = "sobre"; diff --git a/Java/tests/src/test/java/com/microsoft/recognizers/text/tests/datetime/DateTimeExtractorTest.java b/Java/tests/src/test/java/com/microsoft/recognizers/text/tests/datetime/DateTimeExtractorTest.java index 61dea962f3..9f13da65b6 100644 --- a/Java/tests/src/test/java/com/microsoft/recognizers/text/tests/datetime/DateTimeExtractorTest.java +++ b/Java/tests/src/test/java/com/microsoft/recognizers/text/tests/datetime/DateTimeExtractorTest.java @@ -29,9 +29,10 @@ import com.microsoft.recognizers.text.datetime.extractors.BaseTimePeriodExtractor; import com.microsoft.recognizers.text.datetime.extractors.BaseTimeZoneExtractor; import com.microsoft.recognizers.text.datetime.extractors.IDateTimeExtractor; -import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishDateTimeExtractorConfiguration; import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishDateExtractorConfiguration; import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishDatePeriodExtractorConfiguration; +import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishDateTimeExtractorConfiguration; +import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishDateTimePeriodExtractorConfiguration; import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishDurationExtractorConfiguration; import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishHolidayExtractorConfiguration; import com.microsoft.recognizers.text.datetime.spanish.extractors.SpanishTimeExtractorConfiguration; diff --git a/JavaScript/packages/recognizers-date-time/src/resources/englishDateTime.ts b/JavaScript/packages/recognizers-date-time/src/resources/englishDateTime.ts index b7a6a97897..c19a9add42 100644 --- a/JavaScript/packages/recognizers-date-time/src/resources/englishDateTime.ts +++ b/JavaScript/packages/recognizers-date-time/src/resources/englishDateTime.ts @@ -261,11 +261,11 @@ export namespace EnglishDateTime { export const DoubleNumbers: ReadonlyMap = new Map([["half", 0.5],["quarter", 0.25]]); export const HolidayNames: ReadonlyMap = new Map([["easterday", ["easterday","easter"]],["fathers", ["fatherday","fathersday"]],["mothers", ["motherday","mothersday"]],["thanksgiving", ["thanksgivingday","thanksgiving"]],["martinlutherking", ["mlkday","martinlutherkingday","martinlutherkingjrday"]],["washingtonsbirthday", ["washingtonsbirthday","washingtonbirthday"]],["canberra", ["canberraday"]],["labour", ["labourday","laborday"]],["columbus", ["columbusday"]],["memorial", ["memorialday"]],["yuandan", ["yuandan"]],["maosbirthday", ["maosbirthday"]],["teachersday", ["teachersday","teacherday"]],["singleday", ["singleday"]],["allsaintsday", ["allsaintsday"]],["youthday", ["youthday"]],["childrenday", ["childrenday","childday"]],["femaleday", ["femaleday"]],["treeplantingday", ["treeplantingday"]],["arborday", ["arborday"]],["girlsday", ["girlsday"]],["whiteloverday", ["whiteloverday"]],["loverday", ["loverday"]],["christmas", ["christmasday","christmas"]],["xmas", ["xmasday","xmas"]],["newyear", ["newyear"]],["newyearday", ["newyearday"]],["newyearsday", ["newyearsday"]],["inaugurationday", ["inaugurationday"]],["groundhougday", ["groundhougday"]],["valentinesday", ["valentinesday"]],["stpatrickday", ["stpatrickday"]],["aprilfools", ["aprilfools"]],["stgeorgeday", ["stgeorgeday"]],["mayday", ["mayday","intlworkersday","internationalworkersday"]],["cincodemayoday", ["cincodemayoday"]],["baptisteday", ["baptisteday"]],["usindependenceday", ["usindependenceday"]],["independenceday", ["independenceday"]],["bastilleday", ["bastilleday"]],["halloweenday", ["halloweenday"]],["allhallowday", ["allhallowday"]],["allsoulsday", ["allsoulsday"]],["guyfawkesday", ["guyfawkesday"]],["veteransday", ["veteransday"]],["christmaseve", ["christmaseve"]],["newyeareve", ["newyearseve","newyeareve"]]]); export const WrittenDecades: ReadonlyMap = new Map([["hundreds", 0],["tens", 10],["twenties", 20],["thirties", 30],["forties", 40],["fifties", 50],["sixties", 60],["seventies", 70],["eighties", 80],["nineties", 90]]); - export const SpecialDecadeCases: ReadonlyMap = new Map([["noughties", 2000],["two thousands", 2000]]); + export const SpecialDecadeCases: ReadonlyMap = new Map([["noughties", 2000],["aughts", 2000],["two thousands", 2000]]); export const DefaultLanguageFallback = 'MDY'; export const SuperfluousWordList = [ "preferably","how about","maybe","say","like" ]; export const DurationDateRestrictions = [ "today","now" ]; - export const AmbiguityFiltersDict: ReadonlyMap = new Map([["\\bmorning|afternoon|evening|night|day\\b", "\\b(good\\s+(morning|afternoon|evening|night|day))|(nighty\\s+night)\\b"],["\\bmay\\b", "\\b((^may i)|(i|you|he|she|we|they)\\s+may|(may\\s+((((also|not|(also not)|well)\\s+)?(be|ask|contain|constitute|email|e-mail|take|have|result|involve|get|work|reply))|(or may not))))\\b"]]); + export const AmbiguityFiltersDict: ReadonlyMap = new Map([["\\bmorning|afternoon|evening|night|day\\b", "\\b(good\\s+(morning|afternoon|evening|night|day))|(nighty\\s+night)\\b"],["\\bnow\\b", "\\b(^now,)|\\b((is|are)\\s+now\\s+for|for\\s+now)\\b"],["\\bmay\\b", "\\b((^may i)|(i|you|he|she|we|they)\\s+may|(may\\s+((((also|not|(also not)|well)\\s+)?(be|ask|contain|constitute|email|e-mail|take|have|result|involve|get|work|reply))|(or may not))))\\b"]]); export const MorningTermList = [ "morning" ]; export const AfternoonTermList = [ "afternoon" ]; export const EveningTermList = [ "evening" ]; diff --git a/Patterns/English/English-DateTime.yaml b/Patterns/English/English-DateTime.yaml index 4befc8cca3..404dac7a93 100644 --- a/Patterns/English/English-DateTime.yaml +++ b/Patterns/English/English-DateTime.yaml @@ -983,6 +983,7 @@ SpecialDecadeCases: !dictionary types: [ string, int ] entries: 'noughties': 2000 + 'aughts': 2000 'two thousands': 2000 DefaultLanguageFallback: 'MDY' SuperfluousWordList: !list @@ -1000,6 +1001,7 @@ AmbiguityFiltersDict: !dictionary types: [ string, string ] entries: '\bmorning|afternoon|evening|night|day\b': '\b(good\s+(morning|afternoon|evening|night|day))|(nighty\s+night)\b' + '\bnow\b': '\b(^now,)|\b((is|are)\s+now\s+for|for\s+now)\b' '\bmay\b': '\b((^may i)|(i|you|he|she|we|they)\s+may|(may\s+((((also|not|(also not)|well)\s+)?(be|ask|contain|constitute|email|e-mail|take|have|result|involve|get|work|reply))|(or may not))))\b' # For TimeOfDay resolution MorningTermList: !list diff --git a/Python/libraries/recognizers-date-time/recognizers_date_time/resources/english_date_time.py b/Python/libraries/recognizers-date-time/recognizers_date_time/resources/english_date_time.py index e92715c0a4..95a3ff3fac 100644 --- a/Python/libraries/recognizers-date-time/recognizers_date_time/resources/english_date_time.py +++ b/Python/libraries/recognizers-date-time/recognizers_date_time/resources/english_date_time.py @@ -579,11 +579,13 @@ class EnglishDateTime: ("eighties", 80), ("nineties", 90)]) SpecialDecadeCases = dict([("noughties", 2000), + ("aughts", 2000), ("two thousands", 2000)]) DefaultLanguageFallback = 'MDY' SuperfluousWordList = [r'preferably', r'how about', r'maybe', r'say', r'like'] DurationDateRestrictions = [r'today', r'now'] AmbiguityFiltersDict = dict([("\\bmorning|afternoon|evening|night|day\\b", "\\b(good\\s+(morning|afternoon|evening|night|day))|(nighty\\s+night)\\b"), + ("\\bnow\\b", "\\b(^now,)|\\b((is|are)\\s+now\\s+for|for\\s+now)\\b"), ("\\bmay\\b", "\\b((^may i)|(i|you|he|she|we|they)\\s+may|(may\\s+((((also|not|(also not)|well)\\s+)?(be|ask|contain|constitute|email|e-mail|take|have|result|involve|get|work|reply))|(or may not))))\\b")]) MorningTermList = [r'morning'] AfternoonTermList = [r'afternoon']