PT time improvements (#633)

Summary:
New rules for PT time expressions like "5 Maio", "Maio 5", "5 Maio 2022".

Pull Request resolved: https://github.com/facebook/duckling/pull/633

Reviewed By: stroxler

Differential Revision: D30114330

Pulled By: chessai

fbshipit-source-id: f56418d95efa1d7488957b8b8083daec3193949b
This commit is contained in:
Filipe Pereira 2021-08-04 17:12:58 -07:00 committed by Facebook GitHub Bot
parent 328e59ebc4
commit fe4f77bdc0
3 changed files with 457 additions and 348 deletions

File diff suppressed because it is too large Load Diff

View File

@ -123,17 +123,30 @@ allExamples = concat
] ]
, examples (datetime (2013, 5, 5, 0, 0, 0) Day) , examples (datetime (2013, 5, 5, 0, 0, 0) Day)
[ "5 de maio" [ "5 de maio"
, "5 maio"
, "05 maio"
, "cinco de maio" , "cinco de maio"
, "cinco maio"
, "maio 5"
, "maio cinco"
] ]
, examples (datetime (2013, 5, 5, 0, 0, 0) Day) , examples (datetime (2013, 5, 5, 0, 0, 0) Day)
[ "cinco de maio de 2013" [ "cinco de maio de 2013"
, "5 de maio de 2013" , "5 de maio de 2013"
, "5 maio de 2013"
, "5 de maio 2013"
, "5 maio 2013"
, "5/5" , "5/5"
, "5/5/2013" , "5/5/2013"
] ]
, examples (datetime (2013, 7, 4, 0, 0, 0) Day) , examples (datetime (2013, 7, 4, 0, 0, 0) Day)
[ "4 de julho" [ "4 de julho"
, "04 de julho"
, "04 julho"
, "quatro de julho" , "quatro de julho"
, "quatro julho"
, "julho 4"
, "julho quatro"
, "4/7" , "4/7"
, "4/7/2013" , "4/7/2013"
] ]

View File

@ -6,6 +6,7 @@
{-# LANGUAGE GADTs #-} {-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NoRebindableSyntax #-} {-# LANGUAGE NoRebindableSyntax #-}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
@ -20,12 +21,10 @@ import qualified Data.Text as Text
import Duckling.Dimensions.Types import Duckling.Dimensions.Types
import Duckling.Duration.Helpers (isGrain) import Duckling.Duration.Helpers (isGrain)
import Duckling.Numeral.Helpers (parseInt) import Duckling.Numeral.Helpers (parseInt)
import Duckling.Ordinal.Types (OrdinalData(..))
import Duckling.Regex.Types import Duckling.Regex.Types
import Duckling.Time.Helpers import Duckling.Time.Helpers
import Duckling.Time.Types (TimeData(..)) import Duckling.Time.Types (TimeData(..))
import Duckling.Types import Duckling.Types
import qualified Duckling.Ordinal.Types as TOrdinal
import qualified Duckling.Time.Types as TTime import qualified Duckling.Time.Types as TTime
import qualified Duckling.TimeGrain.Types as TG import qualified Duckling.TimeGrain.Types as TG
@ -383,6 +382,7 @@ ruleHourofdayAndRelativeMinutes = Rule
tt $ hourMinute is12H hours n tt $ hourMinute is12H hours n
_ -> Nothing _ -> Nothing
} }
ruleIntegerParaAsHourofdayAsRelativeMinutes :: Rule ruleIntegerParaAsHourofdayAsRelativeMinutes :: Rule
ruleIntegerParaAsHourofdayAsRelativeMinutes = Rule ruleIntegerParaAsHourofdayAsRelativeMinutes = Rule
{ name = "<integer> para as <hour-of-day> (as relative minutes)" { name = "<integer> para as <hour-of-day> (as relative minutes)"
@ -414,6 +414,7 @@ ruleHourofdayIntegerAsRelativeMinutes2 = Rule
tt $ hourMinute is12H hours n tt $ hourMinute is12H hours n
_ -> Nothing _ -> Nothing
} }
ruleHourofdayAndRelativeMinutes2 :: Rule ruleHourofdayAndRelativeMinutes2 :: Rule
ruleHourofdayAndRelativeMinutes2 = Rule ruleHourofdayAndRelativeMinutes2 = Rule
{ name = "<hour-of-day> and <relative minutes> minutos" { name = "<hour-of-day> and <relative minutes> minutos"
@ -432,6 +433,7 @@ ruleHourofdayAndRelativeMinutes2 = Rule
tt $ hourMinute is12H hours n tt $ hourMinute is12H hours n
_ -> Nothing _ -> Nothing
} }
ruleIntegerParaAsHourofdayAsRelativeMinutes2 :: Rule ruleIntegerParaAsHourofdayAsRelativeMinutes2 :: Rule
ruleIntegerParaAsHourofdayAsRelativeMinutes2 = Rule ruleIntegerParaAsHourofdayAsRelativeMinutes2 = Rule
{ name = "<integer> minutos para as <hour-of-day> (as relative minutes)" { name = "<integer> minutos para as <hour-of-day> (as relative minutes)"
@ -460,6 +462,7 @@ ruleHourofdayQuarter = Rule
_) -> tt $ hourMinute is12H hours 15 _) -> tt $ hourMinute is12H hours 15
_ -> Nothing _ -> Nothing
} }
ruleHourofdayAndQuarter :: Rule ruleHourofdayAndQuarter :: Rule
ruleHourofdayAndQuarter = Rule ruleHourofdayAndQuarter = Rule
{ name = "<hour-of-day> and quinze" { name = "<hour-of-day> and quinze"
@ -472,6 +475,7 @@ ruleHourofdayAndQuarter = Rule
_) -> tt $ hourMinute is12H hours 15 _) -> tt $ hourMinute is12H hours 15
_ -> Nothing _ -> Nothing
} }
ruleQuarterParaAsHourofdayAsRelativeMinutes :: Rule ruleQuarterParaAsHourofdayAsRelativeMinutes :: Rule
ruleQuarterParaAsHourofdayAsRelativeMinutes = Rule ruleQuarterParaAsHourofdayAsRelativeMinutes = Rule
{ name = "quinze para as <hour-of-day> (as relative minutes)" { name = "quinze para as <hour-of-day> (as relative minutes)"
@ -496,6 +500,7 @@ ruleHourofdayHalf = Rule
_) -> tt $ hourMinute is12H hours 30 _) -> tt $ hourMinute is12H hours 30
_ -> Nothing _ -> Nothing
} }
ruleHourofdayAndHalf :: Rule ruleHourofdayAndHalf :: Rule
ruleHourofdayAndHalf = Rule ruleHourofdayAndHalf = Rule
{ name = "<hour-of-day> and half" { name = "<hour-of-day> and half"
@ -508,6 +513,7 @@ ruleHourofdayAndHalf = Rule
_) -> tt $ hourMinute is12H hours 30 _) -> tt $ hourMinute is12H hours 30
_ -> Nothing _ -> Nothing
} }
ruleHalfParaAsHourofdayAsRelativeMinutes :: Rule ruleHalfParaAsHourofdayAsRelativeMinutes :: Rule
ruleHalfParaAsHourofdayAsRelativeMinutes = Rule ruleHalfParaAsHourofdayAsRelativeMinutes = Rule
{ name = "half para as <hour-of-day> (as relative minutes)" { name = "half para as <hour-of-day> (as relative minutes)"
@ -532,6 +538,7 @@ ruleHourofdayThreeQuarter = Rule
_) -> tt $ hourMinute is12H hours 45 _) -> tt $ hourMinute is12H hours 45
_ -> Nothing _ -> Nothing
} }
ruleHourofdayAndThreeQuarter :: Rule ruleHourofdayAndThreeQuarter :: Rule
ruleHourofdayAndThreeQuarter = Rule ruleHourofdayAndThreeQuarter = Rule
{ name = "<hour-of-day> and 3/4" { name = "<hour-of-day> and 3/4"
@ -544,6 +551,7 @@ ruleHourofdayAndThreeQuarter = Rule
_) -> tt $ hourMinute is12H hours 45 _) -> tt $ hourMinute is12H hours 45
_ -> Nothing _ -> Nothing
} }
ruleThreeQuarterParaAsHourofdayAsRelativeMinutes :: Rule ruleThreeQuarterParaAsHourofdayAsRelativeMinutes :: Rule
ruleThreeQuarterParaAsHourofdayAsRelativeMinutes = Rule ruleThreeQuarterParaAsHourofdayAsRelativeMinutes = Rule
{ name = "3/4 para as <hour-of-day> (as relative minutes)" { name = "3/4 para as <hour-of-day> (as relative minutes)"
@ -1202,19 +1210,43 @@ ruleTimeofdayAmpm = Rule
_ -> Nothing _ -> Nothing
} }
ruleDayofmonthDeNamedmonth :: Rule ruleDOMOfMonth :: Rule
ruleDayofmonthDeNamedmonth = Rule ruleDOMOfMonth = Rule
{ name = "<day-of-month> de <named-month>" { name = "<day-of-month> (ordinal or number) de <named-month>"
, pattern = , pattern =
[ Predicate isDOMInteger [ Predicate isDOMValue
, regex "de|\\/" , regex "de|\\/"
, Predicate isAMonth , Predicate isAMonth
] ]
, prod = \tokens -> case tokens of , prod = \case
(token:_:Token Time td:_) -> Token Time <$> intersectDOM td token (token:_:Token Time td:_) -> Token Time <$> intersectDOM td token
_ -> Nothing _ -> Nothing
} }
ruleDOMMonth :: Rule
ruleDOMMonth = Rule
{ name = "<day-of-month> (ordinal or number) <named-month>"
, pattern =
[ Predicate isDOMValue
, Predicate isAMonth
]
, prod = \case
(token:Token Time td:_) -> Token Time <$> intersectDOM td token
_ -> Nothing
}
ruleMonthDOM :: Rule
ruleMonthDOM = Rule
{ name = "<named-month> <day-of-month>"
, pattern =
[ Predicate isAMonth
, Predicate isDOMInteger
]
, prod = \case
(Token Time td:token:_) -> Token Time <$> intersectDOM td token
_ -> Nothing
}
ruleEntreDatetimeEDatetimeInterval :: Rule ruleEntreDatetimeEDatetimeInterval :: Rule
ruleEntreDatetimeEDatetimeInterval = Rule ruleEntreDatetimeEDatetimeInterval = Rule
{ name = "entre <datetime> e <datetime> (interval)" { name = "entre <datetime> e <datetime> (interval)"
@ -1705,7 +1737,6 @@ rules =
, ruleAntesDasTimeofday , ruleAntesDasTimeofday
, ruleDatetimeDatetimeInterval , ruleDatetimeDatetimeInterval
, ruleDayOfMonthSt , ruleDayOfMonthSt
, ruleDayofmonthDeNamedmonth
, ruleDayofweekSHourmin , ruleDayofweekSHourmin
, ruleDdddMonthinterval , ruleDdddMonthinterval
, ruleDdmm , ruleDdmm
@ -1720,6 +1751,8 @@ rules =
, ruleDimTimeDaMadrugada , ruleDimTimeDaMadrugada
, ruleDimTimeDaManha , ruleDimTimeDaManha
, ruleDimTimeDaTarde , ruleDimTimeDaTarde
, ruleDOMOfMonth
, ruleDOMMonth
, ruleEmDuration , ruleEmDuration
, ruleEntreDatetimeEDatetimeInterval , ruleEntreDatetimeEDatetimeInterval
, ruleEntreDdEtDdMonthinterval , ruleEntreDdEtDdMonthinterval
@ -1751,6 +1784,7 @@ rules =
, ruleIntersectByDaOrDe , ruleIntersectByDaOrDe
, ruleLastTime , ruleLastTime
, ruleMidnight , ruleMidnight
, ruleMonthDOM
, ruleMorning , ruleMorning
, ruleNCycleAtras , ruleNCycleAtras
, ruleNCycleProximoqueVem , ruleNCycleProximoqueVem