(Time/TimeGrain/Ordinal)/RU_XX: several extra Time forms for Russian

Summary:
Some changes were originally suggested by me during the review of
https://github.com/facebook/duckling/pull/474.
Others are new.

1. "Day after tomorrow/before yesterday"
2. Ordinals in the form of number+suffix like "8th of March"
3. Tuesdays require a special preposition.
4. Support "Yo" (U+0451) in "fourth" and "during daylight".
5. Support special perposition for "next week".
6. Support "one before last" adjective for time grains.
7. Proper suffixes for "quarter" grain.
8. Support "at midnight".
9. Support alternative flag for "afternoon".

Changes in Ordinal and TimeGrain are all driven by the new examples in the
corpus for Time.

There are also a couple of bugfixes:
1. A hidden latin "e" was present in an otherwise Cyrillic regex.
2. Wrong order of options in a regex separated with "|" prevented some matches.

Reviewed By: haoxuany

Differential Revision: D32311714

fbshipit-source-id: 084f6c3893eb5bfd767c267f558b910c6854eb59
This commit is contained in:
Alex Kapranoff 2021-11-30 09:42:37 -08:00 committed by Facebook GitHub Bot
parent e1641aeba4
commit 30b3d29e86
6 changed files with 1033 additions and 501 deletions

View File

@ -30,6 +30,7 @@ allExamples = concat
, "первое" , "первое"
, "первой" , "первой"
, "первого" , "первого"
, "первые"
, "1ая" , "1ая"
, "1-ая" , "1-ая"
, "1ый" , "1ый"
@ -40,6 +41,11 @@ allExamples = concat
, "1-й" , "1-й"
, "1го" , "1го"
, "1-го" , "1-го"
, "1-ого"
, "первой"
, "первым"
, "первому"
, "первым"
] ]
, examples (OrdinalData 3) , examples (OrdinalData 3)
[ "третий" [ "третий"
@ -47,6 +53,7 @@ allExamples = concat
, "третье" , "третье"
, "третьей" , "третьей"
, "третьего" , "третьего"
, "третьи"
, "" , ""
, "3ий" , "3ий"
, "" , ""
@ -61,6 +68,11 @@ allExamples = concat
, "3-е" , "3-е"
, "3-ье" , "3-ье"
, "3-го" , "3-го"
, "3-его"
, "третьей"
, "третьим"
, "третьему"
, "третьим"
] ]
, examples (OrdinalData 4) , examples (OrdinalData 4)
[ "четвертый" [ "четвертый"
@ -68,6 +80,8 @@ allExamples = concat
, "четвертое" , "четвертое"
, "четвертой" , "четвертой"
, "четвертого" , "четвертого"
, "четвёртый"
, "четвертые"
, "" , ""
, "4ый" , "4ый"
, "4ая" , "4ая"
@ -80,39 +94,102 @@ allExamples = concat
, "4-ое" , "4-ое"
, "4-ой" , "4-ой"
, "4-го" , "4-го"
, "4-ого"
, "четвертой"
, "четвертым"
, "четвёртому"
, "четвёртым"
] ]
, examples (OrdinalData 15) , examples (OrdinalData 15)
[ "пятнадцатый" [ "пятнадцатый"
, "15й" , "15й"
, "15-й" , "15-й"
, "15-ый"
, "пятнадцатая"
, "15я"
, "15-я"
, "15-ая"
, "пятнадцатое"
, "15е"
, "15-е"
, "15-ое"
, "пятнадцатому"
, "пятнадцатые"
, "пятнадцатой"
, "пятнадцатым"
, "пятнадцатому"
, "пятнадцатым"
]
, examples (OrdinalData 10)
[ "десятый"
, "10й"
, "10-й"
, "10-ый"
, "десятая"
, "десятой"
] ]
, examples (OrdinalData 21) , examples (OrdinalData 21)
[ "21й" [ "21й"
, "21-й" , "21-й"
, "21-го" , "21-го"
, "21-ого"
, "Двадцать первый" , "Двадцать первый"
, "двадцать первый" , "двадцать первый"
, "двадцать первого" , "двадцать первого"
, "двадцать первой"
] ]
, examples (OrdinalData 23) , examples (OrdinalData 23)
[ "23й" [ "23й"
, "23-й" , "23-й"
, "двадцать третий" , "двадцать третий"
, "двадцать третьего" , "двадцать третьего"
, "двадцать третьей"
, "23-го"
, "23-его"
] ]
, examples (OrdinalData 31) , examples (OrdinalData 31)
[ "31ый" [ "31ый"
, "31-ый" , "31-ый"
, "тридцать первый" , "тридцать первый"
] ]
, examples (OrdinalData 30)
[ "30ый"
, "30-ый"
, "тридцатый"
]
, examples (OrdinalData 48) , examples (OrdinalData 48)
[ "48ое" [ "48ое"
, "48-ое" , "48-ое"
, "сорок восьмое" , "сорок восьмое"
] ]
, examples (OrdinalData 40)
[ "40ое"
, "40-ое"
, "сороковой"
, "сороковое"
, "сороковая"
]
, examples (OrdinalData 99) , examples (OrdinalData 99)
[ "99ый" [ "99ый"
, "99-й" , "99-й"
, "99-ый"
, "девяносто девятый" , "девяносто девятый"
, "девяносто девятая"
]
, examples (OrdinalData 90)
[ "90ый"
, "90-й"
, "90-ый"
, "девяностый"
, "девяностая"
]
, examples (OrdinalData 100)
[ "сотое"
, "сотая"
, "сотый"
, "100-ая"
, "100-я"
, "100-й"
, "100-е"
] ]
] ]

View File

@ -31,6 +31,7 @@ ordinalsFirstthMap = HashMap.fromList
, ( "втор", 2 ) , ( "втор", 2 )
, ( "трет", 3 ) , ( "трет", 3 )
, ( "четверт", 4 ) , ( "четверт", 4 )
, ( "четвёрт", 4 )
, ( "пят", 5 ) , ( "пят", 5 )
, ( "шест", 6 ) , ( "шест", 6 )
, ( "седьм", 7 ) , ( "седьм", 7 )
@ -47,6 +48,14 @@ ordinalsFirstthMap = HashMap.fromList
, ( "восемнадцат", 18 ) , ( "восемнадцат", 18 )
, ( "девятнадцат", 19 ) , ( "девятнадцат", 19 )
, ( "двадцат", 20 ) , ( "двадцат", 20 )
, ( "тридцат", 30 )
, ( "сороков", 40 )
, ( "пятидесят", 50 )
, ( "шестидесят", 60 )
, ( "семидесят", 70 )
, ( "восьмидесят", 80 )
, ( "девяност", 90 )
, ( "сот", 100 )
] ]
cardinalsMap :: HashMap Text.Text Int cardinalsMap :: HashMap Text.Text Int
@ -59,13 +68,14 @@ cardinalsMap = HashMap.fromList
, ( "семьдесят", 70 ) , ( "семьдесят", 70 )
, ( "восемьдесят", 80 ) , ( "восемьдесят", 80 )
, ( "девяносто", 90 ) , ( "девяносто", 90 )
, ( "сто", 100 )
] ]
ruleOrdinalsFirstth :: Rule ruleOrdinalsFirstth :: Rule
ruleOrdinalsFirstth = Rule ruleOrdinalsFirstth = Rule
{ name = "ordinals (first..19th)" { name = "ordinals (first..20th, then 30th, 40th, ..., 100th)"
, pattern = , pattern =
[ regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат)(ье(го|й)?|ого|ый|ой|ий|ая|ое|ья)" [ regex "(перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат|тридцат|сороков|пятидесят|шестидесят|семидесят|восьмидесят|девяност|сот)(ь(его|ему|ей|ем|им|их|и|е)|ого|ому|ый|ой|ий|ая|ое|ья|ом|ые|ым|ых)"
] ]
, prod = \tokens -> case tokens of , prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (match:_)):_) -> (Token RegexMatch (GroupMatch (match:_)):_) ->
@ -78,7 +88,7 @@ ruleOrdinal = Rule
{ name = "ordinal 21..99" { name = "ordinal 21..99"
, pattern = , pattern =
[ regex "(двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)" [ regex "(двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)"
, regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят)(ье(го|й)?|ого|ый|ой|ий|ая|ое|ья)" , regex "(перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят)(ье(го|й)?|ого|ому|ый|ой|ий|ая|ое|ья|ые|ым|ых)"
] ]
, prod = \tokens -> case tokens of , prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (m1:_)): (Token RegexMatch (GroupMatch (m1:_)):
@ -94,7 +104,7 @@ ruleOrdinalDigits :: Rule
ruleOrdinalDigits = Rule ruleOrdinalDigits = Rule
{ name = "ordinal (digits)" { name = "ordinal (digits)"
, pattern = , pattern =
[ regex "0*(\\d+)-?((ы|о|и|а|e|ь)?(ее|й|я|е|го))" [ regex "0*(\\d+)-?((ы|о|и|а|е|ь)?(ее|й|я|е|го|му?))"
] ]
, prod = \tokens -> case tokens of , prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match

File diff suppressed because it is too large Load Diff

View File

@ -45,24 +45,43 @@ allExamples = concat
, examples (datetime (2013, 2, 11, 0, 0, 0) Day) , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
[ "вчера" [ "вчера"
] ]
, examples (datetime (2013, 2, 10, 0, 0, 0) Day)
[ "позавчера"
]
, examples (datetime (2013, 2, 9, 0, 0, 0) Day)
[ "позапозавчера"
]
, examples (datetime (2013, 2, 13, 0, 0, 0) Day) , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
[ "завтра" [ "завтра"
] ]
, examples (datetime (2013, 2, 14, 0, 0, 0) Day)
[ "послезавтра"
]
, examples (datetime (2013, 2, 15, 0, 0, 0) Day)
[ "послепослезавтра"
]
, examples (datetime (2013, 2, 18, 0, 0, 0) Day) , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
[ "понедельник" [ "понедельник"
, "в понедельник"
] ]
, examples (datetime (2013, 2, 18, 0, 0, 0) Day) , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
[ "понедельник, 18 февраля" [ "понедельник, 18 февраля"
, "18 февраля" , "18 февраля"
, "18-е февраля"
, "18-го февраля"
, "восемнадцатое февраля"
, "восемнадцатого февраля"
] ]
, examples (datetime (2013, 2, 19, 0, 0, 0) Day) , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
[ "вторник" [ "вторник"
, "во вторник"
] ]
, examples (datetime (2013, 2, 14, 0, 0, 0) Day) , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
[ "четверг" [ "четверг"
] ]
, examples (datetime (2013, 2, 15, 0, 0, 0) Day) , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
[ "пятница" [ "пятница"
, "в пятницу"
] ]
, examples (datetime (2013, 2, 16, 0, 0, 0) Day) , examples (datetime (2013, 2, 16, 0, 0, 0) Day)
[ "суббота" [ "суббота"
@ -70,20 +89,32 @@ allExamples = concat
, examples (datetime (2013, 3, 1, 0, 0, 0) Day) , examples (datetime (2013, 3, 1, 0, 0, 0) Day)
[ "1 марта" [ "1 марта"
, "первое марта" , "первое марта"
, "1 мар." , "1-е мар."
] ]
, examples (datetime (2015, 3, 3, 0, 0, 0) Day) , examples (datetime (2015, 3, 3, 0, 0, 0) Day)
[ "3 марта 2015" [ "3 марта 2015"
, "3-его марта 2015"
, "3 мар. 2015" , "3 мар. 2015"
, "третьего марта 2015"
, "третье марта 2015"
, "к третьему марта 2015"
] ]
, examples (datetime (2013, 2, 15, 0, 0, 0) Day) , examples (datetime (2013, 2, 15, 0, 0, 0) Day)
[ "15 февраля" [ "15 февраля"
, "15.2" , "15.2"
, "15 Фев" , "15 Фев"
, "15-го Фев"
, "15.02"
, "пятнадцатое февраля"
, "пятнадцатого фев"
] ]
, examples (datetime (2013, 8, 8, 0, 0, 0) Day) , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
[ "8 августа" [ "8 августа"
, "8 Авг" , "8 Авг"
, "восьмое августа"
]
, examples (datetime (2013, 3, 0, 0, 0, 0) Month)
[ "март"
] ]
, examples (datetime (2014, 10, 0, 0, 0, 0) Month) , examples (datetime (2014, 10, 0, 0, 0, 0) Month)
[ "Октябрь 2014" [ "Октябрь 2014"
@ -94,40 +125,102 @@ allExamples = concat
, examples (datetime (1974, 10, 31, 0, 0, 0) Day) , examples (datetime (1974, 10, 31, 0, 0, 0) Day)
[ "31.10.1974" [ "31.10.1974"
, "31.10.74" , "31.10.74"
, "тридцать первое октября 1974"
, "31-ое октября 1974"
] ]
, examples (datetime (2015, 4, 14, 0, 0, 0) Day) , examples (datetime (2015, 4, 14, 0, 0, 0) Day)
[ "14 апреля 2015" [ "14 апреля 2015"
, "четырнадцатое апреля 2015"
] ]
, examples (datetime (2013, 2, 10, 0, 0, 0) Day) , examples (datetime (2013, 2, 10, 0, 0, 0) Day)
[ "Воскресенье, 10 фев." [ "Воскресенье, 10 фев."
] ]
, examples (datetime (2013, 2, 13, 0, 0, 0) Day) , examples (datetime (2013, 2, 13, 0, 0, 0) Day)
[ "Среда, 13 февраля" [ "Среда, 13 февраля"
, "Среда, 13-е февраля"
, "13-е февраля"
] ]
, examples (datetime (2013, 2, 18, 0, 0, 0) Day) , examples (datetime (2013, 2, 18, 0, 0, 0) Day)
[ "Понедельник, 18 фев" [ "Понедельник, 18 фев"
] ]
, examples (datetime (2013, 2, 24, 0, 0, 0) Day)
[ "двадцать четвертое фев"
, "двадцать четвёртое февраля"
, "двадцать четвертого февраля"
, "24-ого февраля"
, "24-е февраля"
, "к двадцать четвёртому февраля"
]
, examples (datetime (2015, 5, 31, 0, 0, 0) Day)
[ "тридцать первое мая 2015"
]
, examples (datetimeInterval ((2013, 2, 11, 0, 0, 0), (2013, 2, 17, 0, 0, 0)) Day) , examples (datetimeInterval ((2013, 2, 11, 0, 0, 0), (2013, 2, 17, 0, 0, 0)) Day)
[ "эта неделя" [ "эта неделя"
] ]
, examples (datetime (2013, 2, 1, 0, 0, 0) Month)
[ "этот месяц"
]
, examples (datetime (2013, 1, 1, 0, 0, 0) Year)
[ "этот год"
]
, examples (datetime (2013, 2, 18, 0, 0, 0) Week)
[ "следующая неделя"
]
, examples (datetime (2013, 2, 18, 0, 0, 0) Week)
[ "на следующей неделе"
]
, examples (datetime (2013, 1, 0, 0, 0, 0) Month) , examples (datetime (2013, 1, 0, 0, 0, 0) Month)
[ "прошлый месяц" [ "прошлый месяц"
, "в прошлом месяце"
]
, examples (datetime (2012, 12, 0, 0, 0, 0) Month)
[ "позапрошлый месяц"
, "в позапрошлом месяце"
] ]
, examples (datetime (2013, 3, 0, 0, 0, 0) Month) , examples (datetime (2013, 3, 0, 0, 0, 0) Month)
[ "следующий месяц" [ "следующий месяц"
, "в следующем месяце"
] ]
, examples (datetime (2014, 0, 0, 0, 0, 0) Year) , examples (datetime (2014, 0, 0, 0, 0, 0) Year)
[ "следующий год" [ "следующий год"
, "в следующем году"
]
, examples (datetime (2013, 1, 1, 0, 0, 0) Quarter)
[ "этот квартал"
]
, examples (datetime (2013, 4, 1, 0, 0, 0) Quarter)
[ "следующий квартал"
, "в следующем квартале"
]
, examples (datetime (2013, 7, 1, 0, 0, 0) Quarter)
[ "третий квартал"
, "в третьем квартале"
]
, examples (datetime (2018, 10, 1, 0, 0, 0) Quarter)
[ "четвертый квартал 2018"
, "четвёртый квартал 2018"
] ]
, examples (datetime (2013, 2, 5, 0, 0, 0) Day) , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
[ "в прошлый вторник" [ "в прошлый вторник"
] ]
, examples (datetime (2013, 2, 19, 0, 0, 0) Day) , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
[ "следующий вторник" [ "следующий вторник"
, "вторник на следующей неделе"
]
, examples (datetime (2013, 2, 13, 0, 0, 0) Day)
[ "следующая среда"
, "в следующую среду"
, "в след среду"
] ]
, examples (datetime (2013, 2, 12, 4, 0, 0) Hour) , examples (datetime (2013, 2, 12, 4, 0, 0) Hour)
[ "в 4 утра" [ "в 4 утра"
] ]
, examples (datetime (2013, 2, 13, 0, 0, 0) Hour)
[ "в полночь"
]
, examples (datetime (2013, 2, 12, 12, 0, 0) Hour)
[ "в полдень"
]
, examples (datetime (2013, 2, 12, 15, 0, 0) Hour) , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
[ "в 3" [ "в 3"
, "3 часа" , "3 часа"
@ -136,15 +229,15 @@ allExamples = concat
, examples (datetime (2013, 2, 12, 3, 18, 0) Minute) , examples (datetime (2013, 2, 12, 3, 18, 0) Minute)
[ "3:18 утра" [ "3:18 утра"
] ]
, examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
[ "3:18"
]
, examples (datetime (2013, 2, 12, 15, 0, 0) Hour) , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
[ "в 3 часа дня" [ "в 3 часа дня"
, "в 15" , "в 15"
, "в 15 часов" , "в 15 часов"
, "15 часов" , "15 часов"
, "в 15ч" , "в 15ч"
, "в пятнадцать часов"
, "в 3 часа пополудни"
, "в 3 часа после полудня"
] ]
, examples (datetime (2013, 4, 1, 18, 0, 0) Hour) , examples (datetime (2013, 4, 1, 18, 0, 0) Hour)
[ "01.04. в 18 часов" [ "01.04. в 18 часов"
@ -153,7 +246,7 @@ allExamples = concat
[ "в 17 часов завтра" [ "в 17 часов завтра"
] ]
, examples (datetime (2013, 2, 12, 15, 15, 0) Minute) , examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
["15:15" [ "15:15"
] ]
, examples (datetime (2013, 2, 12, 20, 0, 0) Hour) , examples (datetime (2013, 2, 12, 20, 0, 0) Hour)
[ "8 часов вечера" [ "8 часов вечера"
@ -164,6 +257,7 @@ allExamples = concat
] ]
, examples (datetime (2013, 2, 16, 9, 0, 0) Hour) , examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
[ "в субботу в 9 часов" [ "в субботу в 9 часов"
, "в субботу в девять"
] ]
, examples (datetime (2014, 7, 18, 19, 0, 0) Hour) , examples (datetime (2014, 7, 18, 19, 0, 0) Hour)
[ "пятница, 18 июля 2014 7 часов вечера" [ "пятница, 18 июля 2014 7 часов вечера"
@ -174,6 +268,7 @@ allExamples = concat
] ]
, examples (datetime (2013, 2, 12, 4, 30, 1) Second) , examples (datetime (2013, 2, 12, 4, 30, 1) Second)
[ "через 1 секунду" [ "через 1 секунду"
, "через секунду"
] ]
, examples (datetime (2013, 2, 12, 4, 31, 0) Second) , examples (datetime (2013, 2, 12, 4, 31, 0) Second)
[ "через 1 минуту" [ "через 1 минуту"
@ -189,6 +284,8 @@ allExamples = concat
] ]
, examples (datetime (2013, 2, 12, 5, 30, 0) Minute) , examples (datetime (2013, 2, 12, 5, 30, 0) Minute)
[ "через 1 час" [ "через 1 час"
, "через один час"
, "через час"
] ]
, examples (datetime (2013, 2, 12, 6, 30, 0) Minute) , examples (datetime (2013, 2, 12, 6, 30, 0) Minute)
[ "через два часа" [ "через два часа"
@ -196,9 +293,6 @@ allExamples = concat
, examples (datetime (2013, 2, 13, 4, 30, 0) Minute) , examples (datetime (2013, 2, 13, 4, 30, 0) Minute)
[ "через 24 часа" [ "через 24 часа"
] ]
, examples (datetime (2013, 2, 13, 0, 0, 0) Day)
[ "завтра"
]
, examples (datetime (2016, 2, 0, 0, 0, 0) Month) , examples (datetime (2016, 2, 0, 0, 0, 0) Month)
[ "через 3 года" [ "через 3 года"
] ]
@ -207,9 +301,11 @@ allExamples = concat
] ]
, examples (datetime (2013, 2, 19, 0, 0, 0) Day) , examples (datetime (2013, 2, 19, 0, 0, 0) Day)
[ "через 1 неделю" [ "через 1 неделю"
, "через неделю"
] ]
, examples (datetime (2013, 2, 5, 4, 0, 0) Hour) , examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
[ "7 дней назад" [ "7 дней назад"
, "7 дней тому назад"
] ]
, examples (datetime (2013, 1, 29, 4, 0, 0) Hour) , examples (datetime (2013, 1, 29, 4, 0, 0) Hour)
[ "14 дней назад" [ "14 дней назад"
@ -219,6 +315,7 @@ allExamples = concat
] ]
, examples (datetime (2013, 2, 5, 0, 0, 0) Day) , examples (datetime (2013, 2, 5, 0, 0, 0) Day)
[ "1 неделю назад" [ "1 неделю назад"
, "неделю тому назад"
] ]
, examples (datetime (2013, 1, 22, 0, 0, 0) Day) , examples (datetime (2013, 1, 22, 0, 0, 0) Day)
[ "три недели назад" [ "три недели назад"
@ -368,6 +465,7 @@ allExamples = concat
] ]
, examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour) , examples (datetimeInterval ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
[ "сегодня днем" [ "сегодня днем"
, "сегодня днём"
] ]
, examples (datetime (2013, 2, 12, 13, 30, 0) Minute) , examples (datetime (2013, 2, 12, 13, 30, 0) Minute)
[ "в 13:30 дня" [ "в 13:30 дня"
@ -406,10 +504,10 @@ allExamples = concat
, "с 14.10. по 15.10.2018" , "с 14.10. по 15.10.2018"
] ]
, examples (datetime (2013, 10, 10, 0, 0, 0) Day) , examples (datetime (2013, 10, 10, 0, 0, 0) Day)
["10.10.2013" [ "10.10.2013"
] ]
, examples (datetime (2013, 2, 12, 10, 10, 0) Minute) , examples (datetime (2013, 2, 12, 10, 10, 0) Minute)
[ "в 10.10" [ "в 10:10"
] ]
, examples (datetime (2013, 2, 12, 17, 10, 0) Minute) , examples (datetime (2013, 2, 12, 17, 10, 0) Minute)
[ "17ч10" [ "17ч10"

View File

@ -36,7 +36,9 @@ ruleInstants = mkRuleInstants
, ( "завтра" , TG.Day , 1, "завтра" ) , ( "завтра" , TG.Day , 1, "завтра" )
, ( "вчера" , TG.Day , -1, "вчера" ) , ( "вчера" , TG.Day , -1, "вчера" )
, ( "послезавтра" , TG.Day , 2, "послезавтра" ) , ( "послезавтра" , TG.Day , 2, "послезавтра" )
, ( "послепослезавтра", TG.Day , 3, "послепослезавтра" )
, ( "позавчера" , TG.Day , -2, "позавчера" ) , ( "позавчера" , TG.Day , -2, "позавчера" )
, ( "позапозавчера", TG.Day , -3, "позапозавчера" )
, ( "Конец месяца" , TG.Month , 1, "(конец|конца) месяца" ) , ( "Конец месяца" , TG.Month , 1, "(конец|конца) месяца" )
, ( "Конец года" , TG.Year , 1, "(конец|конца) года" ) , ( "Конец года" , TG.Year , 1, "(конец|конца) года" )
] ]
@ -93,7 +95,7 @@ ruleLastTime :: Rule
ruleLastTime = Rule ruleLastTime = Rule
{ name = "last <time>" { name = "last <time>"
, pattern = , pattern =
[ regex "(в )?прошл(ый|ого|ому|ом|ые|ых|ым|ыми|ая)" [ regex "(на |в )?прошл(ый|ого|ому|ом|ое|ые|ых|ыми|ым|ая|ой|ую)"
, Predicate isOkWithThisNext , Predicate isOkWithThisNext
] ]
, prod = \case , prod = \case
@ -264,11 +266,20 @@ ruleNoon = Rule
, prod = \_ -> tt $ hour False 12 , prod = \_ -> tt $ hour False 12
} }
ruleMidnight :: Rule
ruleMidnight = Rule
{ name = "midnight"
, pattern =
[ regex "полночь"
]
, prod = \_ -> tt $ hour False 0
}
ruleThisnextDayofweek :: Rule ruleThisnextDayofweek :: Rule
ruleThisnextDayofweek = Rule ruleThisnextDayofweek = Rule
{ name = "this|next <day-of-week>" { name = "this|next <day-of-week>"
, pattern = , pattern =
[ regex "следующ(ий|ая|ее)" [ regex "след(ующ(ий|ая|ее|ую))?"
, Predicate isADayOfWeek , Predicate isADayOfWeek
] ]
, prod = \case , prod = \case
@ -296,7 +307,7 @@ ruleNextCycle :: Rule
ruleNextCycle = Rule ruleNextCycle = Rule
{ name = "next <cycle>" { name = "next <cycle>"
, pattern = , pattern =
[ regex "(в |на )?следующ(ий|его|ему|им|ем|ие|их|ими)" [ regex "(на |в |к )?след(ующ(ий|его|ему|ими|ем|ие|их|им|ей|ая|ую))?"
, dimension TimeGrain , dimension TimeGrain
] ]
, prod = \case , prod = \case
@ -309,7 +320,7 @@ ruleOnDate :: Rule
ruleOnDate = Rule ruleOnDate = Rule
{ name = "on <date>" { name = "on <date>"
, pattern = , pattern =
[ regex "в" [ regex "во|в|к"
, dimension Time , dimension Time
] ]
, prod = \case , prod = \case
@ -321,7 +332,7 @@ ruleLastCycle :: Rule
ruleLastCycle = Rule ruleLastCycle = Rule
{ name = "last <cycle>" { name = "last <cycle>"
, pattern = , pattern =
[ regex "(в )?прошл(ый|ого|ому|ым|ом|ые|ых|ыми)" [ regex "(на |в )?прошл(ый|ого|ому|ом|ое|ые|ых|ыми|ым|ая|ой|ую)"
, dimension TimeGrain , dimension TimeGrain
] ]
, prod = \case , prod = \case
@ -330,11 +341,24 @@ ruleLastCycle = Rule
_ -> Nothing _ -> Nothing
} }
ruleBeforeLastCycle :: Rule
ruleBeforeLastCycle = Rule
{ name = "one <cycle> before last"
, pattern =
[ regex "(на |в )?позапрошл(ый|ого|ому|ыми|ом|ое|ые|ых|ым|ая|ой|ую)"
, dimension TimeGrain
]
, prod = \case
(_:Token TimeGrain grain:_) ->
tt . cycleNth grain $ - 2
_ -> Nothing
}
ruleLastCycle2 :: Rule ruleLastCycle2 :: Rule
ruleLastCycle2 = Rule ruleLastCycle2 = Rule
{ name = "last <cycle>" { name = "last <cycle>"
, pattern = , pattern =
[ regex "(в )?прошедш(ий|его|ему|им|ем|их|ие|ими)" [ regex "(в )?прошедш(ий|его|ему|ими|ем|их|ие|им)"
, dimension TimeGrain , dimension TimeGrain
] ]
, prod = \case , prod = \case
@ -360,7 +384,7 @@ ruleAfternoon :: Rule
ruleAfternoon = Rule ruleAfternoon = Rule
{ name = "afternoon" { name = "afternoon"
, pattern = , pattern =
[ regex "дня|днем" [ regex "(дня|дн[её]м)|пополудни|после полудня"
] ]
, prod = \_ -> , prod = \_ ->
let from = hour False 12 let from = hour False 12
@ -394,7 +418,6 @@ ruleNamedmonthDayofmonthOrdinal = Rule
_ -> Nothing _ -> Nothing
} }
ruleHourofdayIntegerAsRelativeMinutes :: Rule ruleHourofdayIntegerAsRelativeMinutes :: Rule
ruleHourofdayIntegerAsRelativeMinutes = Rule ruleHourofdayIntegerAsRelativeMinutes = Rule
{ name = "<hour-of-day> <integer> (as relative minutes)" { name = "<hour-of-day> <integer> (as relative minutes)"
@ -487,7 +510,7 @@ ruleDurationAgo = Rule
{ name = "<duration> ago" { name = "<duration> ago"
, pattern = , pattern =
[ dimension Duration [ dimension Duration
, regex "назад" , regex "(тому )?назад"
] ]
, prod = \case , prod = \case
(Token Duration dd:_:_) -> (Token Duration dd:_:_) ->
@ -640,8 +663,6 @@ ruleWeek = Rule
let match = Text.strip $ Text.toLower m let match = Text.strip $ Text.toLower m
period <- case match of period <- case match of
"эта" -> interval TTime.Closed (cycleNth TG.Week 0) end "эта" -> interval TTime.Closed (cycleNth TG.Week 0) end
"rest of the" -> interval TTime.Open today end
-- no prefix, implicit 'the'
"неделя" -> interval TTime.Open today end "неделя" -> interval TTime.Open today end
_ -> Nothing _ -> Nothing
let l = case match of { "неделя" -> mkLatent; _ -> id; } let l = case match of { "неделя" -> mkLatent; _ -> id; }
@ -720,7 +741,7 @@ ruleMorning :: Rule
ruleMorning = Rule ruleMorning = Rule
{ name = "morning" { name = "morning"
, pattern = , pattern =
[ regex "утро|утром|утра" [ regex "утром|утро|утра"
] ]
, prod = \_ -> , prod = \_ ->
let from = hour False 3 let from = hour False 3
@ -733,7 +754,7 @@ ruleThisPartofday :: Rule
ruleThisPartofday = Rule ruleThisPartofday = Rule
{ name = "this <part-of-day>" { name = "this <part-of-day>"
, pattern = , pattern =
[ regex "(в )?(это|эту|этот|этого|этому|эти)" [ regex "(в )?(эту|этот|этого|этому|эти|это)"
, Predicate isAPartOfDay , Predicate isAPartOfDay
] ]
, prod = \case , prod = \case
@ -745,7 +766,7 @@ ruleThisCycle :: Rule
ruleThisCycle = Rule ruleThisCycle = Rule
{ name = "this <cycle>" { name = "this <cycle>"
, pattern = , pattern =
[ regex "(в )?(это|эту|этот|этого|этому|эти)" [ regex "(в )?(эту|этот|этого|этому|эти)"
, dimension TimeGrain , dimension TimeGrain
] ]
, prod = \case , prod = \case
@ -758,7 +779,7 @@ ruleThisTime :: Rule
ruleThisTime = Rule ruleThisTime = Rule
{ name = "this <time>" { name = "this <time>"
, pattern = , pattern =
[ regex "(в )?(это|эту|этот|этого|этому|эти)" [ regex "(в )?(эту|этот|этого|этому|эти|это)"
, Predicate isOkWithThisNext , Predicate isOkWithThisNext
] ]
, prod = \case , prod = \case
@ -797,7 +818,7 @@ ruleNight :: Rule
ruleNight = Rule ruleNight = Rule
{ name = "night" { name = "night"
, pattern = , pattern =
[ regex "ночь|ночи|ночью" [ regex "ночью|ночи|ночь"
] ]
, prod = \_ -> , prod = \_ ->
let from = hour False 0 let from = hour False 0
@ -838,7 +859,7 @@ ruleHhmm :: Rule
ruleHhmm = Rule ruleHhmm = Rule
{ name = "hh:mm" { name = "hh:mm"
, pattern = , pattern =
[ regex "((?:[01]?\\d)|(?:2[0-3]))[:.ч]([0-5]\\d)(?:час(ов|а|у)?|ч)?" [ regex "((?:[01]?\\d)|(?:2[0-3]))[:ч]([0-5]\\d)(?:час(ов|а|у)?|ч)?"
] ]
, prod = \case , prod = \case
(Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
@ -1082,6 +1103,7 @@ rules =
, ruleIntersectBy , ruleIntersectBy
, ruleIntersectByOfFromS , ruleIntersectByOfFromS
, ruleLastCycle , ruleLastCycle
, ruleBeforeLastCycle
, ruleLastCycle2 , ruleLastCycle2
, ruleLastCycleOfTime , ruleLastCycleOfTime
, ruleLastCycleOfTime2 , ruleLastCycleOfTime2
@ -1100,6 +1122,7 @@ rules =
, ruleNextNCycle , ruleNextNCycle
, ruleNight , ruleNight
, ruleNoon , ruleNoon
, ruleMidnight
, ruleNthTimeAfterTime , ruleNthTimeAfterTime
, ruleNthTimeOfTime , ruleNthTimeOfTime
, ruleNthTimeOfTime2 , ruleNthTimeOfTime2

View File

@ -24,10 +24,10 @@ grains = [ ("second (grain) ", "сек(унд(а|у|ы)?)?", Second)
, ("minute (grain)" , "мин(ут(а|у|ы)?)?", Minute) , ("minute (grain)" , "мин(ут(а|у|ы)?)?", Minute)
, ("hour (grain)" , "ч(ас(а|ов)?)?", Hour) , ("hour (grain)" , "ч(ас(а|ов)?)?", Hour)
, ("day (grain)" , "день|дня|дней", Day) , ("day (grain)" , "день|дня|дней", Day)
, ("week (grain)" , "недел(ь|я|и|ю)?", Week) , ("week (grain)" , "недел(ь|я|и|ю|е)?", Week)
, ("month (grain)" , "месяц(а|ев)?", Month) , ("month (grain)" , "месяц(а|ев|е)?", Month)
, ("quarter (grain)", "квартал(а)?", Quarter) , ("quarter (grain)", "квартал(а|е)?", Quarter)
, ("year (grain)" , "года?|лет", Year) , ("year (grain)" , "год(а|у)?|лет", Year)
] ]
rules :: [Rule] rules :: [Rule]