Duckling/Numeral/AR/EG/Rules.hs (306 lines of code) (raw):
-- Copyright (c) 2016-present, Facebook, Inc.
-- All rights reserved.
--
-- This source code is licensed under the BSD-style license found in the
-- LICENSE file in the root directory of this source tree.
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoRebindableSyntax #-}
module Duckling.Numeral.AR.EG.Rules (rules) where
import Data.Maybe
import Prelude
import qualified Data.HashMap.Strict as HashMap
import Duckling.Dimensions.Types
import Duckling.Numeral.AR.EG.Helpers
( digitsMap
, parseArabicDoubleFromText
, parseArabicIntegerFromText
)
import Duckling.Numeral.Helpers
import Duckling.Numeral.Types (NumeralData (..))
import Duckling.Regex.Types
import Duckling.Types
import qualified Duckling.Numeral.Types as TNumeral
ruleInteger2 :: Rule
ruleInteger2 = Rule
{ name = "integer 2"
, pattern =
[ regex "[إأا]?تني[ي]?ن"
]
, prod = \_ -> integer 2
}
ruleInteger3 :: Rule
ruleInteger3 = Rule
{ name = "integer 3"
, pattern =
[ regex "تلات[هة]?"
]
, prod = \_ -> integer 3
}
ruleInteger8 :: Rule
ruleInteger8 = Rule
{ name = "integer 8"
, pattern =
[ regex "تمان(ي[هة])?"
]
, prod = \_ -> integer 8
}
ruleInteger11 :: Rule
ruleInteger11 = Rule
{ name = "integer 11"
, pattern =
[ regex "(إأا)?حداشر"
]
, prod = \_ -> integer 11
}
ruleInteger12 :: Rule
ruleInteger12 = Rule
{ name = "integer 12"
, pattern =
[ regex "[إأا]?[تط]ناشر"
]
, prod = \_ -> integer 12
}
ruleInteger13 :: Rule
ruleInteger13 = Rule
{ name = "integer 13"
, pattern =
[ regex "[تط]ل(ا)?[تط]اشر"
]
, prod = \_ -> integer 13
}
ruleInteger14 :: Rule
ruleInteger14 = Rule
{ name = "integer 14"
, pattern =
[ regex "[إأا]ربع[تط]اشر"
]
, prod = \_ -> integer 14
}
ruleInteger15 :: Rule
ruleInteger15 = Rule
{ name = "integer 15"
, pattern =
[ regex "خمس[تط]اشر"
]
, prod = \_ -> integer 15
}
ruleInteger16 :: Rule
ruleInteger16 = Rule
{ name = "integer 16"
, pattern =
[ regex "س[تط]اشر"
]
, prod = \_ -> integer 16
}
ruleInteger17 :: Rule
ruleInteger17 = Rule
{ name = "integer 17"
, pattern =
[ regex "سبع[تط]اشر"
]
, prod = \_ -> integer 17
}
ruleInteger18 :: Rule
ruleInteger18 = Rule
{ name = "integer 18"
, pattern =
[ regex "[تط]من[تط]اشر"
]
, prod = \_ -> integer 18
}
ruleInteger19 :: Rule
ruleInteger19 = Rule
{ name = "integer 19"
, pattern =
[ regex "تسع[تط]اشر"
]
, prod = \_ -> integer 19
}
ruleInteger30_80 :: Rule
ruleInteger30_80 = Rule
{ name = "integer (30, 80)"
, pattern =
[ regex "([تط]لا[تط]|[تط]مان)(ين)"
]
, prod = \tokens -> case tokens of
Token RegexMatch (GroupMatch (match:_)):_ ->
(* 10) <$> HashMap.lookup match digitsMap >>= integer
_ -> Nothing
}
ruleInteger100 :: Rule
ruleInteger100 = Rule
{ name = "integer (100)"
, pattern =
[ regex "مي[هةت]"
]
, prod = const $ integer 100
}
ruleInteger200 :: Rule
ruleInteger200 = Rule
{ name = "integer (200)"
, pattern =
[ regex "م(ي)?تين"
]
, prod = const $ integer 200
}
ruleInteger300 :: Rule
ruleInteger300 = Rule
{ name = "integer (300)"
, pattern =
[ regex "([تط]و?لا?[تط]و?)مي[هةت]"
]
, prod = const $ integer 300
}
ruleInteger400 :: Rule
ruleInteger400 = Rule
{ name = "integer (400)"
, pattern =
[ regex "(رو?بعو?)مي[هةت]"
]
, prod = const $ integer 400
}
ruleInteger500 :: Rule
ruleInteger500 = Rule
{ name = "integer (500)"
, pattern =
[ regex "(خو?مسو?)مي[هةت]"
]
, prod = const $ integer 500
}
ruleInteger600 :: Rule
ruleInteger600 = Rule
{ name = "integer (600)"
, pattern =
[ regex "(سو?تو?)مي[هةت]"
]
, prod = const $ integer 600
}
ruleInteger700 :: Rule
ruleInteger700 = Rule
{ name = "integer (700)"
, pattern =
[ regex "(سو?بعو?)مي[هةت]"
]
, prod = const $ integer 700
}
ruleInteger800 :: Rule
ruleInteger800 = Rule
{ name = "integer (800)"
, pattern =
[ regex "([تط]و?منو?)مي[هةت]"
]
, prod = const $ integer 800
}
ruleInteger900 :: Rule
ruleInteger900 = Rule
{ name = "integer (900)"
, pattern =
[ regex "([تط]و?سعو?)مي[هةت]"
]
, prod = const $ integer 900
}
ruleInteger101_999 :: Rule
ruleInteger101_999 = Rule
{ name = "integer 101..999"
, pattern =
[ oneOf [100, 200 .. 900]
, regex "\\s"
, oneOf $ map (+) [10, 20 .. 90] <*> [1..9]
]
, prod = \tokens -> case tokens of
(Token Numeral NumeralData{TNumeral.value = v1}:
_:
Token Numeral NumeralData{TNumeral.value = v2}:
_) -> double $ v1 + v2
_ -> Nothing
}
ruleInteger3000 :: Rule
ruleInteger3000 = Rule
{ name = "integer (3000)"
, pattern =
[ regex "([تط]لا?[تط])( ?[اآ])?لاف"
]
, prod = const $ integer 3000
}
ruleInteger4000 :: Rule
ruleInteger4000 = Rule
{ name = "integer (4000)"
, pattern =
[ regex "[أا]ربع(ت| ?[اآ])لاف"
]
, prod = const $ integer 4000
}
ruleInteger5000 :: Rule
ruleInteger5000 = Rule
{ name = "integer (5000)"
, pattern =
[ regex "خمس(ت| ?[اآ])لاف"
]
, prod = const $ integer 5000
}
ruleInteger6000 :: Rule
ruleInteger6000 = Rule
{ name = "integer (6000)"
, pattern =
[ regex "س(ت| ?[اآ])لاف"
]
, prod = const $ integer 6000
}
ruleInteger7000 :: Rule
ruleInteger7000 = Rule
{ name = "integer (7000)"
, pattern =
[ regex "سبع(ت| ?[اآ])لاف"
]
, prod = const $ integer 7000
}
ruleInteger8000 :: Rule
ruleInteger8000 = Rule
{ name = "integer (8000)"
, pattern =
[ regex "[تط]م[ا]?ن(ت| ?[اآ])لاف"
]
, prod = const $ integer 8000
}
ruleInteger9000 :: Rule
ruleInteger9000 = Rule
{ name = "integer (9000)"
, pattern =
[ regex "([تط]سع)(ت| ?[اآ])لاف"
]
, prod = const $ integer 9000
}
rules :: [Rule]
rules =
[ ruleInteger2
, ruleInteger3
, ruleInteger8
, ruleInteger11
, ruleInteger12
, ruleInteger13
, ruleInteger14
, ruleInteger15
, ruleInteger16
, ruleInteger17
, ruleInteger18
, ruleInteger19
, ruleInteger30_80
, ruleInteger100
, ruleInteger200
, ruleInteger300
, ruleInteger400
, ruleInteger500
, ruleInteger600
, ruleInteger700
, ruleInteger800
, ruleInteger900
, ruleInteger101_999
, ruleInteger3000
, ruleInteger4000
, ruleInteger5000
, ruleInteger6000
, ruleInteger7000
, ruleInteger8000
, ruleInteger9000
]