(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ый"
@ -40,6 +41,11 @@ allExamples = concat
, "1-й"
, "1го"
, "1-го"
, "1-ого"
, "первой"
, "первым"
, "первому"
, "первым"
]
, examples (OrdinalData 3)
[ "третий"
@ -47,6 +53,7 @@ allExamples = concat
, "третье"
, "третьей"
, "третьего"
, "третьи"
, ""
, "3ий"
, ""
@ -61,6 +68,11 @@ allExamples = concat
, "3-е"
, "3-ье"
, "3-го"
, "3-его"
, "третьей"
, "третьим"
, "третьему"
, "третьим"
]
, examples (OrdinalData 4)
[ "четвертый"
@ -68,6 +80,8 @@ allExamples = concat
, "четвертое"
, "четвертой"
, "четвертого"
, "четвёртый"
, "четвертые"
, ""
, "4ый"
, "4ая"
@ -80,39 +94,102 @@ allExamples = concat
, "4-ое"
, "4-ой"
, "4-го"
, "4-ого"
, "четвертой"
, "четвертым"
, "четвёртому"
, "четвёртым"
]
, examples (OrdinalData 15)
[ "пятнадцатый"
, "15й"
, "15-й"
, "15-ый"
, "пятнадцатая"
, "15я"
, "15-я"
, "15-ая"
, "пятнадцатое"
, "15е"
, "15-е"
, "15-ое"
, "пятнадцатому"
, "пятнадцатые"
, "пятнадцатой"
, "пятнадцатым"
, "пятнадцатому"
, "пятнадцатым"
]
, examples (OrdinalData 10)
[ "десятый"
, "10й"
, "10-й"
, "10-ый"
, "десятая"
, "десятой"
]
, examples (OrdinalData 21)
[ "21й"
, "21-й"
, "21-го"
, "21-ого"
, "Двадцать первый"
, "двадцать первый"
, "двадцать первого"
, "двадцать первой"
]
, examples (OrdinalData 23)
[ "23й"
, "23-й"
, "двадцать третий"
, "двадцать третьего"
, "двадцать третьей"
, "23-го"
, "23-его"
]
, examples (OrdinalData 31)
[ "31ый"
, "31-ый"
, "тридцать первый"
]
, examples (OrdinalData 30)
[ "30ый"
, "30-ый"
, "тридцатый"
]
, examples (OrdinalData 48)
[ "48ое"
, "48-ое"
, "сорок восьмое"
]
, examples (OrdinalData 40)
[ "40ое"
, "40-ое"
, "сороковой"
, "сороковое"
, "сороковая"
]
, examples (OrdinalData 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 )
, ( "трет", 3 )
, ( "четверт", 4 )
, ( "четвёрт", 4 )
, ( "пят", 5 )
, ( "шест", 6 )
, ( "седьм", 7 )
@ -47,6 +48,14 @@ ordinalsFirstthMap = HashMap.fromList
, ( "восемнадцат", 18 )
, ( "девятнадцат", 19 )
, ( "двадцат", 20 )
, ( "тридцат", 30 )
, ( "сороков", 40 )
, ( "пятидесят", 50 )
, ( "шестидесят", 60 )
, ( "семидесят", 70 )
, ( "восьмидесят", 80 )
, ( "девяност", 90 )
, ( "сот", 100 )
]
cardinalsMap :: HashMap Text.Text Int
@ -59,13 +68,14 @@ cardinalsMap = HashMap.fromList
, ( "семьдесят", 70 )
, ( "восемьдесят", 80 )
, ( "девяносто", 90 )
, ( "сто", 100 )
]
ruleOrdinalsFirstth :: Rule
ruleOrdinalsFirstth = Rule
{ name = "ordinals (first..19th)"
{ name = "ordinals (first..20th, then 30th, 40th, ..., 100th)"
, pattern =
[ regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат)(ье(го|й)?|ого|ый|ой|ий|ая|ое|ья)"
[ regex "(перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят|десят|одиннадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат|тридцат|сороков|пятидесят|шестидесят|семидесят|восьмидесят|девяност|сот)(ь(его|ему|ей|ем|им|их|и|е)|ого|ому|ый|ой|ий|ая|ое|ья|ом|ые|ым|ых)"
]
, prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (match:_)):_) ->
@ -78,7 +88,7 @@ ruleOrdinal = Rule
{ name = "ordinal 21..99"
, pattern =
[ regex "(двадцать|тридцать|сорок|пятьдесят|шестьдесят|семьдесят|восемьдесят|девяносто)"
, regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят)(ье(го|й)?|ого|ый|ой|ий|ая|ое|ья)"
, regex "(перв|втор|трет|четв[её]рт|пят|шест|седьм|восьм|девят)(ье(го|й)?|ого|ому|ый|ой|ий|ая|ое|ья|ые|ым|ых)"
]
, prod = \tokens -> case tokens of
(Token RegexMatch (GroupMatch (m1:_)):
@ -94,7 +104,7 @@ ruleOrdinalDigits :: Rule
ruleOrdinalDigits = Rule
{ name = "ordinal (digits)"
, pattern =
[ regex "0*(\\d+)-?((ы|о|и|а|e|ь)?(ее|й|я|е|го))"
[ regex "0*(\\d+)-?((ы|о|и|а|е|ь)?(ее|й|я|е|го|му?))"
]
, prod = \tokens -> case tokens of
(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, 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, 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)
[ "понедельник, 18 февраля"
, "18 февраля"
, "18-е февраля"
, "18-го февраля"
, "восемнадцатое февраля"
, "восемнадцатого февраля"
]
, examples (datetime (2013, 2, 19, 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, 16, 0, 0, 0) Day)
[ "суббота"
@ -70,20 +89,32 @@ allExamples = concat
, examples (datetime (2013, 3, 1, 0, 0, 0) Day)
[ "1 марта"
, "первое марта"
, "1 мар."
, "1-е мар."
]
, examples (datetime (2015, 3, 3, 0, 0, 0) Day)
[ "3 марта 2015"
, "3-его марта 2015"
, "3 мар. 2015"
, "третьего марта 2015"
, "третье марта 2015"
, "к третьему марта 2015"
]
, examples (datetime (2013, 2, 15, 0, 0, 0) Day)
[ "15 февраля"
, "15.2"
, "15 Фев"
, "15-го Фев"
, "15.02"
, "пятнадцатое февраля"
, "пятнадцатого фев"
]
, examples (datetime (2013, 8, 8, 0, 0, 0) Day)
[ "8 августа"
, "8 Авг"
, "восьмое августа"
]
, examples (datetime (2013, 3, 0, 0, 0, 0) Month)
[ "март"
]
, examples (datetime (2014, 10, 0, 0, 0, 0) Month)
[ "Октябрь 2014"
@ -94,40 +125,102 @@ allExamples = concat
, examples (datetime (1974, 10, 31, 0, 0, 0) Day)
[ "31.10.1974"
, "31.10.74"
, "тридцать первое октября 1974"
, "31-ое октября 1974"
]
, examples (datetime (2015, 4, 14, 0, 0, 0) Day)
[ "14 апреля 2015"
, "четырнадцатое апреля 2015"
]
, examples (datetime (2013, 2, 10, 0, 0, 0) Day)
[ "Воскресенье, 10 фев."
]
, examples (datetime (2013, 2, 13, 0, 0, 0) Day)
[ "Среда, 13 февраля"
, "Среда, 13-е февраля"
, "13-е февраля"
]
, examples (datetime (2013, 2, 18, 0, 0, 0) Day)
[ "Понедельник, 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 (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 (2012, 12, 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 (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, 19, 0, 0, 0) Day)
[ "следующий вторник"
, "вторник на следующей неделе"
]
, examples (datetime (2013, 2, 13, 0, 0, 0) Day)
[ "следующая среда"
, "в следующую среду"
, "в след среду"
]
, examples (datetime (2013, 2, 12, 4, 0, 0) Hour)
[ "в 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)
[ "в 3"
, "3 часа"
@ -136,15 +229,15 @@ allExamples = concat
, examples (datetime (2013, 2, 12, 3, 18, 0) Minute)
[ "3:18 утра"
]
, examples (datetime (2013, 2, 13, 3, 18, 0) Minute)
[ "3:18"
]
, examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
[ "в 3 часа дня"
, "в 15"
, "в 15 часов"
, "15 часов"
, "в 15ч"
, "в пятнадцать часов"
, "в 3 часа пополудни"
, "в 3 часа после полудня"
]
, examples (datetime (2013, 4, 1, 18, 0, 0) Hour)
[ "01.04. в 18 часов"
@ -153,7 +246,7 @@ allExamples = concat
[ "в 17 часов завтра"
]
, examples (datetime (2013, 2, 12, 15, 15, 0) Minute)
["15:15"
[ "15:15"
]
, examples (datetime (2013, 2, 12, 20, 0, 0) Hour)
[ "8 часов вечера"
@ -164,6 +257,7 @@ allExamples = concat
]
, examples (datetime (2013, 2, 16, 9, 0, 0) Hour)
[ "в субботу в 9 часов"
, "в субботу в девять"
]
, examples (datetime (2014, 7, 18, 19, 0, 0) Hour)
[ "пятница, 18 июля 2014 7 часов вечера"
@ -174,6 +268,7 @@ allExamples = concat
]
, examples (datetime (2013, 2, 12, 4, 30, 1) Second)
[ "через 1 секунду"
, "через секунду"
]
, examples (datetime (2013, 2, 12, 4, 31, 0) Second)
[ "через 1 минуту"
@ -189,6 +284,8 @@ allExamples = concat
]
, examples (datetime (2013, 2, 12, 5, 30, 0) Minute)
[ "через 1 час"
, "через один час"
, "через час"
]
, examples (datetime (2013, 2, 12, 6, 30, 0) Minute)
[ "через два часа"
@ -196,9 +293,6 @@ allExamples = concat
, examples (datetime (2013, 2, 13, 4, 30, 0) Minute)
[ "через 24 часа"
]
, examples (datetime (2013, 2, 13, 0, 0, 0) Day)
[ "завтра"
]
, examples (datetime (2016, 2, 0, 0, 0, 0) Month)
[ "через 3 года"
]
@ -207,9 +301,11 @@ allExamples = concat
]
, examples (datetime (2013, 2, 19, 0, 0, 0) Day)
[ "через 1 неделю"
, "через неделю"
]
, examples (datetime (2013, 2, 5, 4, 0, 0) Hour)
[ "7 дней назад"
, "7 дней тому назад"
]
, examples (datetime (2013, 1, 29, 4, 0, 0) Hour)
[ "14 дней назад"
@ -219,6 +315,7 @@ allExamples = concat
]
, examples (datetime (2013, 2, 5, 0, 0, 0) Day)
[ "1 неделю назад"
, "неделю тому назад"
]
, 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 (datetime (2013, 2, 12, 13, 30, 0) Minute)
[ "в 13:30 дня"
@ -406,10 +504,10 @@ allExamples = concat
, "с 14.10. по 15.10.2018"
]
, examples (datetime (2013, 10, 10, 0, 0, 0) Day)
["10.10.2013"
[ "10.10.2013"
]
, examples (datetime (2013, 2, 12, 10, 10, 0) Minute)
[ "в 10.10"
[ "в 10:10"
]
, examples (datetime (2013, 2, 12, 17, 10, 0) Minute)
[ "17ч10"

View File

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

View File

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