mirror of
https://github.com/facebook/duckling.git
synced 2024-10-05 17:37:44 +03:00
Duration/DE+EN: integer <hours> and <minutes> to accept valid minutes
Summary: * as title * refactored `numberBetween` to be a `Predicate` Reviewed By: nishsinghal20 Differential Revision: D34180649 fbshipit-source-id: 8fbe6db83e8b22181bd0bbde533e2d3390d24c75
This commit is contained in:
parent
03c6197283
commit
c6a48a1d06
@ -226,7 +226,7 @@ ruleOneDollarAnd = Rule
|
||||
{ name = "one dollar and x dimes (short form)"
|
||||
, pattern =
|
||||
[ regex "個"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
|
||||
|
@ -19,7 +19,7 @@ import Duckling.Regex.Types
|
||||
import Control.Monad (join)
|
||||
import qualified Data.Text as Text
|
||||
import Prelude
|
||||
import Duckling.Numeral.Helpers (parseInteger)
|
||||
import Duckling.Numeral.Helpers (numberBetween, parseInteger)
|
||||
import Duckling.Duration.Types (DurationData(..))
|
||||
import qualified Duckling.Duration.Types as TDuration
|
||||
import Data.String
|
||||
@ -216,7 +216,7 @@ ruleHoursAndMinutes = Rule
|
||||
, pattern =
|
||||
[ Predicate isNatural
|
||||
, regex "(ein(en?) )?stunden?( und)?"
|
||||
, Predicate isNatural
|
||||
, Predicate $ and . sequence [isNatural, numberBetween 1 60]
|
||||
, Predicate $ isGrain TG.Minute
|
||||
]
|
||||
, prod = \case
|
||||
|
@ -20,7 +20,7 @@ import qualified Data.Text as Text
|
||||
import Duckling.Dimensions.Types
|
||||
import Duckling.Duration.Helpers
|
||||
import Duckling.Duration.Types (DurationData(..))
|
||||
import Duckling.Numeral.Helpers (parseInteger)
|
||||
import Duckling.Numeral.Helpers (numberBetween, parseInteger)
|
||||
import Duckling.Numeral.Types (NumeralData(..))
|
||||
import Duckling.Regex.Types
|
||||
import Duckling.Types
|
||||
@ -180,7 +180,7 @@ ruleDurationHoursAndMinutes = Rule
|
||||
, pattern =
|
||||
[ Predicate isNatural
|
||||
, regex "hours?( and)?"
|
||||
, Predicate isNatural
|
||||
, Predicate $ and . sequence [isNatural, numberBetween 1 60]
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral h:
|
||||
|
@ -124,7 +124,7 @@ ruleCompositeTens :: Rule
|
||||
ruleCompositeTens = Rule
|
||||
{ name = "integer ([3-9][1-9])"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "en"
|
||||
, oneOf [20, 30..90]
|
||||
]
|
||||
|
@ -42,7 +42,7 @@ ruleInteger23 = Rule
|
||||
, pattern =
|
||||
[ oneOf [100, 200 .. 900]
|
||||
, regex "و"
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -86,7 +86,7 @@ ruleInteger22 :: Rule
|
||||
ruleInteger22 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "و"
|
||||
, oneOf [20, 30 .. 90]
|
||||
]
|
||||
@ -102,7 +102,7 @@ ruleInteger21 :: Rule
|
||||
ruleInteger21 = Rule
|
||||
{ name = "integer (13..19)"
|
||||
, pattern =
|
||||
[ numberBetween 3 10
|
||||
[ Predicate $ numberBetween 3 10
|
||||
, numberWith TNumeral.value (== 10)
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
|
@ -111,7 +111,7 @@ ruleCompositeTens = Rule
|
||||
, pattern =
|
||||
[ oneOf [20, 30..90]
|
||||
, regex "и"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
@ -147,7 +147,7 @@ ruleCompositeHundreds = Rule
|
||||
{ name = "integer 101..999"
|
||||
, pattern =
|
||||
[ oneOf [200, 300..900]
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = hundreds}:
|
||||
|
@ -140,7 +140,10 @@ ruleHigherTensWithOnes :: Rule
|
||||
ruleHigherTensWithOnes = Rule
|
||||
{ name = "number (31..39 41..49 51..59 61..69 71..79 81..89 91..99)"
|
||||
, pattern =
|
||||
[oneOf [30, 40, 50, 60, 70, 80, 90], regex "-", numberBetween 1 9]
|
||||
[ oneOf [30, 40, 50, 60, 70, 80, 90]
|
||||
, regex "-"
|
||||
, Predicate $ numberBetween 1 9
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
_:
|
||||
@ -185,7 +188,10 @@ ruleTwenties :: Rule
|
||||
ruleTwenties = Rule
|
||||
{ name = "number (21..29)"
|
||||
, pattern =
|
||||
[oneOf [20], regex "(-i-| i )", numberBetween 1 10]
|
||||
[ oneOf [20]
|
||||
, regex "(-i-| i )"
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
_:
|
||||
@ -212,10 +218,10 @@ ruleNumerals :: Rule
|
||||
ruleNumerals = Rule
|
||||
{ name = "numbers 200..999"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, regex "-"
|
||||
, numberWith TNumeral.value (== 100)
|
||||
, numberBetween 0 100
|
||||
, Predicate $ numberBetween 0 100
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -242,7 +248,7 @@ ruleBelowTenWithTwoDigits = Rule
|
||||
{ name = "integer (0-9) with two digits"
|
||||
, pattern =
|
||||
[ regex "zero|0"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double v
|
||||
|
@ -87,7 +87,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20, 30 .. 90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -170,7 +170,7 @@ ruleNumeralsOg :: Rule
|
||||
ruleNumeralsOg = Rule
|
||||
{ name = "numbers og"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "og"
|
||||
, oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
]
|
||||
|
@ -123,7 +123,7 @@ ruleNumeralsUnd :: Rule
|
||||
ruleNumeralsUnd = Rule
|
||||
{ name = "numbers und"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "und"
|
||||
, oneOf [20, 30 .. 90]
|
||||
]
|
||||
|
@ -123,7 +123,7 @@ ruleCompositeTens = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20,30..90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens} :
|
||||
|
@ -161,7 +161,7 @@ ruleCompositeTens = Rule
|
||||
, pattern =
|
||||
[ oneOf [20,30..90]
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
|
@ -69,9 +69,8 @@ ruleBelowTenWithTwoDigits = Rule
|
||||
{
|
||||
name = "integer (0-9) with two digits"
|
||||
, pattern =
|
||||
[
|
||||
regex "((c|z)ero)|0"
|
||||
, numberBetween 1 10
|
||||
[ regex "((c|z)ero)|0"
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(
|
||||
@ -124,12 +123,17 @@ ruleNumeralSixteenToTwentyNine = Rule
|
||||
ruleNumeralSixteenToNineteenWithDiez :: Rule
|
||||
ruleNumeralSixteenToNineteenWithDiez = Rule
|
||||
{ name = "number (16..19, two words)"
|
||||
, pattern = [numberWith TNumeral.value (== 10), regex "y", numberBetween 6 10]
|
||||
, pattern =
|
||||
[ numberWith TNumeral.value (== 10)
|
||||
, regex "y"
|
||||
, Predicate $ numberBetween 6 10
|
||||
]
|
||||
, prod = \case
|
||||
(_ : _ : Token Numeral NumeralData { TNumeral.value = v } : _) ->
|
||||
double $ 10 + v
|
||||
_ -> Nothing
|
||||
}
|
||||
|
||||
byTensMap :: HashMap.HashMap Text.Text Integer
|
||||
byTensMap =
|
||||
HashMap.fromList
|
||||
@ -161,7 +165,10 @@ ruleNumeralTwentyOneToNinetyNine :: Rule
|
||||
ruleNumeralTwentyOneToNinetyNine = Rule
|
||||
{ name = "number (21..29 31..39 41..49 51..59 61..69 71..79 81..89 91..99)"
|
||||
, pattern =
|
||||
[oneOf [20, 30 .. 90], regex "y", numberBetween 1 10]
|
||||
[ oneOf [20, 30 .. 90]
|
||||
, regex "y"
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData { TNumeral.value = v1 } : _ : Token Numeral NumeralData { TNumeral.value = v2 } : _) ->
|
||||
double $ v1 + v2
|
||||
@ -221,7 +228,7 @@ ruleTwoPartHundreds :: Rule
|
||||
ruleTwoPartHundreds = Rule
|
||||
{ name = "2..9 cientos"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, regex "cientos"
|
||||
]
|
||||
, prod = \case
|
||||
@ -235,7 +242,7 @@ ruleNumeralHundredsAndSmaller = Rule
|
||||
{ name = "<hundreds> 0..99"
|
||||
, pattern =
|
||||
[ numberWith TNumeral.value (TNumeral.isMultiple 100)
|
||||
, numberBetween 0 100
|
||||
, Predicate $ numberBetween 0 100
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData { TNumeral.value = v1 } : Token Numeral NumeralData { TNumeral.value = v2 } : _)
|
||||
@ -247,7 +254,7 @@ ruleNumeralMultiply :: Rule
|
||||
ruleNumeralMultiply = Rule
|
||||
{ name = "2..999 <multipliable>"
|
||||
, pattern =
|
||||
[ numberBetween 2 1000
|
||||
[ Predicate $ numberBetween 2 1000
|
||||
, Predicate isMultipliable
|
||||
]
|
||||
, prod = \case
|
||||
@ -261,7 +268,7 @@ ruleNumeralThousandsAnd = Rule
|
||||
{ name = "<thousands> 0..999"
|
||||
, pattern =
|
||||
[ numberWith TNumeral.value (TNumeral.isMultiple 1000)
|
||||
, numberBetween 0 999
|
||||
, Predicate $ numberBetween 0 999
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData { TNumeral.value = v1 } : Token Numeral NumeralData { TNumeral.value = v2 } : _)
|
||||
@ -274,7 +281,7 @@ ruleNumeralMillionsAnd = Rule
|
||||
{ name = "<millions> 0..999999"
|
||||
, pattern =
|
||||
[ numberWith TNumeral.value (TNumeral.isMultiple 1000000)
|
||||
, numberBetween 0 999999
|
||||
, Predicate $ numberBetween 0 999999
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData { TNumeral.value = v1 } : Token Numeral NumeralData { TNumeral.value = v2 } : _)
|
||||
|
@ -87,7 +87,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -135,7 +135,7 @@ ruleCompositeTens = Rule
|
||||
, pattern =
|
||||
[ oneOf [20,30..90]
|
||||
, regex "و"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
@ -151,7 +151,7 @@ ruleCompositeHundred = Rule
|
||||
, pattern =
|
||||
[ oneOf [100,200..900]
|
||||
, regex "و"
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
|
@ -57,7 +57,7 @@ ruleNumerals2 = Rule
|
||||
, pattern =
|
||||
[ oneOf [20, 50, 40, 30]
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 2 10
|
||||
, Predicate $ numberBetween 2 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -119,7 +119,7 @@ ruleNumerals5 = Rule
|
||||
, pattern =
|
||||
[ oneOf [60, 80]
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 2 20
|
||||
, Predicate $ numberBetween 2 20
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -170,7 +170,7 @@ ruleNumeral3 = Rule
|
||||
, pattern =
|
||||
[ numberWith TNumeral.value (== 10)
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 7 10
|
||||
, Predicate $ numberBetween 7 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(_:
|
||||
|
@ -68,7 +68,7 @@ ruleCompositeTens = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [ 20, 30..90 ]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
@ -83,7 +83,7 @@ ruleCompositeTensWithAnd = Rule
|
||||
, pattern =
|
||||
[ oneOf [ 20, 30..90 ]
|
||||
, regex "ו"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
@ -230,7 +230,7 @@ ruleInteger14 :: Rule
|
||||
ruleInteger14 = Rule
|
||||
{ name = "integer 11..19"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, numberWith TNumeral.value (== 10)
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -263,7 +263,7 @@ ruleInteger16 = Rule
|
||||
{ name = "integer 101..999"
|
||||
, pattern =
|
||||
[ oneOf [300, 600, 500, 100, 800, 200, 900, 700, 400]
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -222,7 +222,7 @@ ruleCompositeHundreds = Rule
|
||||
, pattern =
|
||||
[ oneOf [100,200..5000]
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 1 99
|
||||
, Predicate $ numberBetween 1 99
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = hundreds}:
|
||||
@ -239,7 +239,7 @@ ruleCompositeThousands = Rule
|
||||
, pattern =
|
||||
[ oneOf [1000,2000..50000]
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 1 999
|
||||
, Predicate $ numberBetween 1 999
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = thousands}:
|
||||
|
@ -143,7 +143,7 @@ ruleNumbersI = Rule
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, regex "i"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -255,7 +255,7 @@ ruleInteger4 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -290,9 +290,9 @@ ruleNumbers :: Rule
|
||||
ruleNumbers = Rule
|
||||
{ name = "numbers 100..999"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, numberWith TNumeral.value (== 100)
|
||||
, numberBetween 0 100
|
||||
, Predicate $ numberBetween 0 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -101,12 +101,10 @@ numberWith f pred = Predicate $ \x ->
|
||||
(Token Numeral x@NumeralData{}) -> pred (f x)
|
||||
_ -> False
|
||||
|
||||
numberBetween :: Double -> Double -> PatternItem
|
||||
numberBetween low up = Predicate $ \x ->
|
||||
case x of
|
||||
(Token Numeral NumeralData {value = v, multipliable = False}) ->
|
||||
low <= v && v < up
|
||||
_ -> False
|
||||
numberBetween :: Double -> Double -> Predicate
|
||||
numberBetween low up (Token Numeral NumeralData {value = v, multipliable = False}) =
|
||||
low <= v && v < up
|
||||
numberBetween _ _ _ = False
|
||||
|
||||
isNatural :: Predicate
|
||||
isNatural (Token Numeral NumeralData {value = v}) =
|
||||
|
@ -47,7 +47,7 @@ ruleTeen :: Rule
|
||||
ruleTeen = Rule
|
||||
{ name = "teen"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, regex "belas"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -132,7 +132,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -222,7 +222,7 @@ ruleInteger2 :: Rule
|
||||
ruleInteger2 = Rule
|
||||
{ name = "integer 20..90"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, numberWith TNumeral.value (== 10)
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
|
@ -159,7 +159,7 @@ ruleNumeral3 = Rule
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, regex "e"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -287,9 +287,9 @@ ruleNumerals :: Rule
|
||||
ruleNumerals = Rule
|
||||
{ name = "numbers 200..999"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, numberWith TNumeral.value (== 100)
|
||||
, numberBetween 0 100
|
||||
, Predicate $ numberBetween 0 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -52,7 +52,7 @@ ruleInteger10 = Rule
|
||||
{ name = "integer (1000..1999)"
|
||||
, pattern =
|
||||
[ regex "千"
|
||||
, numberBetween 1 1000
|
||||
, Predicate $ numberBetween 1 1000
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
|
||||
@ -76,7 +76,7 @@ ruleInteger15 :: Rule
|
||||
ruleInteger15 = Rule
|
||||
{ name = "integer (20000..90000)"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, regex "万"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -111,7 +111,7 @@ ruleInteger3 :: Rule
|
||||
ruleInteger3 = Rule
|
||||
{ name = "integer (20..90)"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, regex "十"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -133,7 +133,7 @@ ruleInteger6 = Rule
|
||||
{ name = "integer (100..199)"
|
||||
, pattern =
|
||||
[ regex "百"
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ v + 100
|
||||
@ -145,7 +145,7 @@ ruleInteger12 = Rule
|
||||
{ name = "integer 2001..9999"
|
||||
, pattern =
|
||||
[ oneOf [3000, 9000, 7000, 8000, 2000, 4000, 6000, 5000]
|
||||
, numberBetween 1 1000
|
||||
, Predicate $ numberBetween 1 1000
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -178,7 +178,7 @@ ruleInteger7 :: Rule
|
||||
ruleInteger7 = Rule
|
||||
{ name = "integer (200..900)"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, regex "百"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -191,7 +191,7 @@ ruleInteger14 = Rule
|
||||
{ name = "integer (10000..19999)"
|
||||
, pattern =
|
||||
[ regex "万"
|
||||
, numberBetween 1 10000
|
||||
, Predicate $ numberBetween 1 10000
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
|
||||
@ -204,7 +204,7 @@ ruleInteger8 = Rule
|
||||
{ name = "integer 201..999"
|
||||
, pattern =
|
||||
[ oneOf [300, 600, 500, 800, 200, 900, 700, 400]
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -218,7 +218,7 @@ ruleInteger16 = Rule
|
||||
{ name = "integer 20001..99999"
|
||||
, pattern =
|
||||
[ oneOf [20000, 40000, 80000, 60000, 30000, 70000, 90000, 50000]
|
||||
, numberBetween 1 10000
|
||||
, Predicate $ numberBetween 1 10000
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -269,7 +269,7 @@ ruleInteger4 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -283,7 +283,7 @@ ruleInteger2 = Rule
|
||||
{ name = "integer (11..19)"
|
||||
, pattern =
|
||||
[ regex "十"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ v + 10
|
||||
@ -294,7 +294,7 @@ ruleInteger11 :: Rule
|
||||
ruleInteger11 = Rule
|
||||
{ name = "integer (2000..9000)"
|
||||
, pattern =
|
||||
[ numberBetween 2 10
|
||||
[ Predicate $ numberBetween 2 10
|
||||
, regex "千"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
|
@ -209,7 +209,7 @@ ruleCompositeTens = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20,40..90]
|
||||
, numberBetween 1 20
|
||||
, Predicate $ numberBetween 1 20
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
@ -224,7 +224,7 @@ ruleCompositeHundreds = Rule
|
||||
, pattern =
|
||||
[ oneOf [100,200..900]
|
||||
, oneOf [20,40..90]
|
||||
, numberBetween 1 20
|
||||
, Predicate $ numberBetween 1 20
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = hundreds}:
|
||||
@ -239,7 +239,7 @@ ruleCompositeHundredsAndUnits = Rule
|
||||
{ name = "integer 100..999"
|
||||
, pattern =
|
||||
[ oneOf [100,200..900]
|
||||
, numberBetween 1 20
|
||||
, Predicate $ numberBetween 1 20
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = hundreds}:
|
||||
|
@ -112,7 +112,7 @@ ruleNumeralsUnd = Rule
|
||||
{ name = "numbers und"
|
||||
, pattern =
|
||||
[ oneOf [20, 30 .. 90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -29,9 +29,9 @@ ruleInteger5 :: Rule
|
||||
ruleInteger5 = Rule
|
||||
{ name = "integer (11..99) "
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "ဆယ့်"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -72,7 +72,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer (11..19) "
|
||||
, pattern =
|
||||
[ regex "ဆယ့်"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ v + 10
|
||||
@ -102,7 +102,7 @@ ruleInteger6 :: Rule
|
||||
ruleInteger6 = Rule
|
||||
{ name = "integer (100..900)"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "ရာ"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -114,7 +114,7 @@ ruleInteger7 :: Rule
|
||||
ruleInteger7 = Rule
|
||||
{ name = "integer (1000..9000)"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "ထောင်"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -126,7 +126,7 @@ ruleInteger8 :: Rule
|
||||
ruleInteger8 = Rule
|
||||
{ name = "integer (10000..90000)"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "သောင်း"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
@ -147,7 +147,7 @@ ruleInteger4 :: Rule
|
||||
ruleInteger4 = Rule
|
||||
{ name = "integer (10..90)"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "ဆယ်"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
|
@ -107,7 +107,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -146,7 +146,7 @@ ruleNumeralsEn :: Rule
|
||||
ruleNumeralsEn = Rule
|
||||
{ name = "numbers en"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, regex "-?en-?"
|
||||
, oneOf [20, 30 .. 90]
|
||||
]
|
||||
|
@ -137,8 +137,8 @@ ruleSpecialCompositionForMissingHundredsLikeInOneTwentyTwo :: Rule
|
||||
ruleSpecialCompositionForMissingHundredsLikeInOneTwentyTwo = Rule
|
||||
{ name = "special composition for missing hundreds like in one twenty two"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
, numberBetween 10 100
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, Predicate $ numberBetween 10 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -516,7 +516,7 @@ ruleInteger2 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20, 30 .. 90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -173,7 +173,7 @@ ruleCompositeTens = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20,30..90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
@ -188,7 +188,7 @@ ruleDecsAnd = Rule
|
||||
, pattern =
|
||||
[ oneOf [20, 30..90]
|
||||
, regex "e"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -203,7 +203,7 @@ ruleCompositeCents = Rule
|
||||
{ name = "integer 101..999"
|
||||
, pattern =
|
||||
[ oneOf [100, 200..900]
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = hundreds}:
|
||||
@ -218,7 +218,7 @@ ruleCentsAnd = Rule
|
||||
, pattern =
|
||||
[ oneOf [100, 200..900]
|
||||
, regex "e"
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -232,8 +232,8 @@ ruleSkipHundreds :: Rule
|
||||
ruleSkipHundreds = Rule
|
||||
{ name = "one twenty two"
|
||||
, pattern =
|
||||
[ numberBetween 1 10
|
||||
, numberBetween 10 100
|
||||
[ Predicate $ numberBetween 1 10
|
||||
, Predicate $ numberBetween 10 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = hundreds}:
|
||||
|
@ -69,7 +69,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20, 30 .. 90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -179,7 +179,7 @@ ruleInteger7 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -193,7 +193,7 @@ ruleInteger8 = Rule
|
||||
{ name = "integer 101..999"
|
||||
, pattern =
|
||||
[ oneOf [300, 600, 500, 100, 800, 200, 900, 700, 400]
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -98,7 +98,7 @@ ruleIntegerCompositeTens = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20, 30..90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
|
@ -96,7 +96,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -87,7 +87,7 @@ ruleCompositeTens = Rule
|
||||
{ name = "integer 11..19 21..29 .. 91..99"
|
||||
, pattern = [oneOf [20,30..90]
|
||||
, regex "-?na-?"
|
||||
, numberBetween 1 10]
|
||||
, Predicate $ numberBetween 1 10]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
Token Numeral NumeralData{TNumeral.value = v2}:
|
||||
|
@ -246,7 +246,7 @@ ruleCompositeTens = Rule
|
||||
, pattern =
|
||||
[ oneOf [20,30..90]
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
|
@ -607,7 +607,7 @@ ruleInteger4 = Rule
|
||||
{ name = "integer 11..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 10, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -145,7 +145,7 @@ ruleInteger7 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
@ -159,7 +159,7 @@ ruleInteger8 = Rule
|
||||
{ name = "integer 101..999"
|
||||
, pattern =
|
||||
[ oneOf [300, 600, 500, 100, 800, 200, 900, 700, 400]
|
||||
, numberBetween 1 100
|
||||
, Predicate $ numberBetween 1 100
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -101,7 +101,7 @@ ruleInteger3 = Rule
|
||||
{ name = "integer 21..99"
|
||||
, pattern =
|
||||
[ oneOf [20, 30 .. 90]
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
|
@ -92,7 +92,7 @@ ruleCompositeTens = Rule
|
||||
, pattern =
|
||||
[ oneOf [20,30,40]
|
||||
, regex "[\\s\\-]+"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = tens}:
|
||||
@ -324,7 +324,7 @@ ruleHundredPrefix = Rule
|
||||
{ name = "one hundred and <integer> (short form)"
|
||||
, pattern =
|
||||
[ regex "百|佰"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
|
||||
@ -337,7 +337,7 @@ ruleThousandPrefix = Rule
|
||||
{ name = "one thousand and <integer> (short form)"
|
||||
, pattern =
|
||||
[ regex "千|仟"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
|
||||
@ -350,7 +350,7 @@ ruleTenThousandPrefix = Rule
|
||||
{ name = "ten thousand and <integer> (short form)"
|
||||
, pattern =
|
||||
[ regex "万|萬"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
]
|
||||
, prod = \case
|
||||
(_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
|
||||
|
@ -72,7 +72,7 @@ ruleCattyTael = Rule
|
||||
, pattern =
|
||||
[ Predicate isPositive
|
||||
, regex "斤"
|
||||
, numberBetween 1 10
|
||||
, Predicate $ numberBetween 1 10
|
||||
, regex "两|兩"
|
||||
]
|
||||
, prod = \case
|
||||
|
@ -12,13 +12,24 @@ module Duckling.Duration.EN.Tests
|
||||
import Prelude
|
||||
import Data.String
|
||||
import Test.Tasty
|
||||
import Test.Tasty.HUnit
|
||||
|
||||
import Duckling.Dimensions.Types
|
||||
import Duckling.Duration.EN.Corpus
|
||||
import Duckling.Testing.Asserts
|
||||
import Duckling.Testing.Types hiding (examples)
|
||||
import Duckling.Types (Range(..))
|
||||
|
||||
tests :: TestTree
|
||||
tests = testGroup "EN Tests"
|
||||
[ makeCorpusTest [Seal Duration] corpus
|
||||
, makeNegativeCorpusTest [Seal Duration] negativeCorpus
|
||||
, rangeTests
|
||||
]
|
||||
|
||||
rangeTests :: TestTree
|
||||
rangeTests = testCase "Range Test" $
|
||||
mapM_ (analyzedRangeTest testContext testOptions . withTargets [Seal Duration]) xs
|
||||
where
|
||||
xs = [ ("1 hour 111565513", Range 0 6) -- ruleDurationHoursAndMinutes to accept valid minutes
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user