mirror of
https://github.com/facebook/duckling.git
synced 2024-11-28 08:34:46 +03:00
Added Amount of Money Dimension to Arabic language
Summary: Closes https://github.com/facebook/duckling/pull/134 Reviewed By: JonCoens Differential Revision: D6649920 Pulled By: patapizza fbshipit-source-id: 9c647c84f5ae4f3dc26cb0c7aa74abb097ea001a
This commit is contained in:
parent
fc574a448e
commit
89822776c6
126
Duckling/AmountOfMoney/AR/Corpus.hs
Normal file
126
Duckling/AmountOfMoney/AR/Corpus.hs
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
-- 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. An additional grant
|
||||||
|
-- of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module Duckling.AmountOfMoney.AR.Corpus
|
||||||
|
( corpus
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Data.String
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
import Duckling.AmountOfMoney.Types
|
||||||
|
import Duckling.Locale
|
||||||
|
import Duckling.Resolve
|
||||||
|
import Duckling.Testing.Types
|
||||||
|
|
||||||
|
corpus :: Corpus
|
||||||
|
corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
|
||||||
|
|
||||||
|
allExamples :: [Example]
|
||||||
|
allExamples = concat
|
||||||
|
[ examples (simple Dollar 1)
|
||||||
|
[ "$1"
|
||||||
|
, "1 دولار"
|
||||||
|
]
|
||||||
|
, examples (simple Dollar 10)
|
||||||
|
[ "$10"
|
||||||
|
, "$ 10"
|
||||||
|
, "10 $"
|
||||||
|
, "10$"
|
||||||
|
, "10$"
|
||||||
|
, "10 دولار"
|
||||||
|
, "عشرة دولارات"
|
||||||
|
]
|
||||||
|
, examples (simple Cent 10)
|
||||||
|
[ "10 سنتات"
|
||||||
|
, "10 سنت"
|
||||||
|
, "10 سينت"
|
||||||
|
, "10 سينتات"
|
||||||
|
, "10 c"
|
||||||
|
, "10¢"
|
||||||
|
]
|
||||||
|
, examples (simple Dollar 1e4)
|
||||||
|
[ "10000 دولار"
|
||||||
|
, "$10,000"
|
||||||
|
, "10000$"
|
||||||
|
]
|
||||||
|
, examples (simple EUR 20)
|
||||||
|
[ "20 يورو"
|
||||||
|
, "20 اورو"
|
||||||
|
, "20 أورو"
|
||||||
|
, "20€"
|
||||||
|
, "20 €"
|
||||||
|
]
|
||||||
|
, examples (simple Pound 10)
|
||||||
|
[ "10 جنيه"
|
||||||
|
, "10 جنيهات"
|
||||||
|
]
|
||||||
|
, examples (simple Dollar 20.43)
|
||||||
|
[ "20$ و 43c"
|
||||||
|
, "$20 43"
|
||||||
|
, "20$ 43c"
|
||||||
|
, "20 دولار و43 سنت"
|
||||||
|
, "20.43 $"
|
||||||
|
]
|
||||||
|
, examples (simple GBP 3)
|
||||||
|
[ "3 جنيهات استرلينية"
|
||||||
|
, "3 جنيه استرليني"
|
||||||
|
]
|
||||||
|
, examples (simple KWD 42)
|
||||||
|
[ "42 KWD"
|
||||||
|
, "42 دينار كويتي"
|
||||||
|
]
|
||||||
|
, examples (simple LBP 42)
|
||||||
|
[ "42 LBP"
|
||||||
|
, "42 ليرة لبنانية"
|
||||||
|
, "42 ليرات لبنانية"
|
||||||
|
]
|
||||||
|
, examples (simple EGP 42)
|
||||||
|
[ "42 EGP"
|
||||||
|
, "42 جنيه مصري"
|
||||||
|
, "42 جنيهات مصريه"
|
||||||
|
]
|
||||||
|
, examples (simple QAR 42)
|
||||||
|
[ "42 QAR"
|
||||||
|
, "42 ريال قطري"
|
||||||
|
, "42 ريالات قطرية"
|
||||||
|
]
|
||||||
|
, examples (simple SAR 42)
|
||||||
|
[ "42 SAR"
|
||||||
|
, "42 ريال سعودي"
|
||||||
|
]
|
||||||
|
, examples (between Dollar (10, 20))
|
||||||
|
[ "من 10 الى 20 دولار"
|
||||||
|
, "بحدود 10-20 دولار"
|
||||||
|
, "ما بين عشرة وعشرون دولار"
|
||||||
|
, "من عشرة لعشرين دولار"
|
||||||
|
, "حوالي 10$-20$"
|
||||||
|
, "10-20 $"
|
||||||
|
, "10-20 دولار"
|
||||||
|
]
|
||||||
|
, examples (under EUR 7)
|
||||||
|
[ "تحت سبعة اورو"
|
||||||
|
, "اقل من سبعة يورو"
|
||||||
|
, "اقل من 7 يورو"
|
||||||
|
]
|
||||||
|
, examples (above Dollar 3.42)
|
||||||
|
[ "اكثر من ثلاثة دولار و42 سينت"
|
||||||
|
, "3.42$ على الاقل"
|
||||||
|
]
|
||||||
|
, examples (simple JOD 5)
|
||||||
|
[ "5 دينار اردني"
|
||||||
|
, "5 دنانير أردنية"
|
||||||
|
]
|
||||||
|
, examples (simple ILS 5)
|
||||||
|
[ "5 شيقل"
|
||||||
|
, "5 شواقل"
|
||||||
|
, "خمسة شيكل"
|
||||||
|
]
|
||||||
|
]
|
403
Duckling/AmountOfMoney/AR/Rules.hs
Normal file
403
Duckling/AmountOfMoney/AR/Rules.hs
Normal file
@ -0,0 +1,403 @@
|
|||||||
|
-- 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. An additional grant
|
||||||
|
-- of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
|
||||||
|
{-# LANGUAGE GADTs #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module Duckling.AmountOfMoney.AR.Rules
|
||||||
|
( rules
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.String
|
||||||
|
import Prelude
|
||||||
|
import qualified Data.Text as Text
|
||||||
|
|
||||||
|
import Duckling.AmountOfMoney.Helpers
|
||||||
|
import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
|
||||||
|
import Duckling.Dimensions.Types
|
||||||
|
import Duckling.Numeral.Types (NumeralData (..))
|
||||||
|
import Duckling.Regex.Types
|
||||||
|
import Duckling.Types
|
||||||
|
import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
|
||||||
|
import qualified Duckling.Numeral.Types as TNumeral
|
||||||
|
|
||||||
|
rulePounds :: Rule
|
||||||
|
rulePounds = Rule
|
||||||
|
{ name = "£"
|
||||||
|
, pattern =
|
||||||
|
[ regex "جنيه(ات)?"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleDinars :: Rule
|
||||||
|
ruleDinars = Rule
|
||||||
|
{ name = "dinars"
|
||||||
|
, pattern =
|
||||||
|
[ regex "دينار|دنانير"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dinar
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleDirhams :: Rule
|
||||||
|
ruleDirhams = Rule
|
||||||
|
{ name = "Dirhams"
|
||||||
|
, pattern =
|
||||||
|
[ regex "درا?هم"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dirham
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleRiyals :: Rule
|
||||||
|
ruleRiyals = Rule
|
||||||
|
{ name = "Riyals"
|
||||||
|
, pattern =
|
||||||
|
[ regex "ريال(ات)?"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Riyal
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleDollars :: Rule
|
||||||
|
ruleDollars = Rule
|
||||||
|
{ name = "Dollars"
|
||||||
|
, pattern =
|
||||||
|
[ regex "دولار(ات)?"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleShekel :: Rule
|
||||||
|
ruleShekel = Rule
|
||||||
|
{ name = "Shekel"
|
||||||
|
, pattern =
|
||||||
|
[ regex "شي[كق]ل|شوا[كق]ل"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly ILS
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleEuro :: Rule
|
||||||
|
ruleEuro = Rule
|
||||||
|
{ name = "Euro"
|
||||||
|
, pattern =
|
||||||
|
[ regex "[أاي]ورو"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly EUR
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleOtherPounds :: Rule
|
||||||
|
ruleOtherPounds = Rule
|
||||||
|
{ name = "other pounds"
|
||||||
|
, pattern =
|
||||||
|
[ regex "جنيه(ات)? (مصر|استرلين)ي?[ةه]?"
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token RegexMatch (GroupMatch (_:match:_)):
|
||||||
|
_) -> case Text.toLower match of
|
||||||
|
"مصر" -> Just . Token AmountOfMoney $ currencyOnly EGP
|
||||||
|
"استرلين" -> Just . Token AmountOfMoney $ currencyOnly GBP
|
||||||
|
_ -> Nothing
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleOtherDinars :: Rule
|
||||||
|
ruleOtherDinars = Rule
|
||||||
|
{ name = "dinars"
|
||||||
|
, pattern =
|
||||||
|
[ regex "(دينار|دنانير) ([أا]ردن|كويت|عراق)ي?[ةه]?"
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token RegexMatch (GroupMatch (_:match:_)):
|
||||||
|
_) -> case Text.toLower match of
|
||||||
|
"كويت" -> Just . Token AmountOfMoney $ currencyOnly KWD
|
||||||
|
"اردن" -> Just . Token AmountOfMoney $ currencyOnly JOD
|
||||||
|
"أردن" -> Just . Token AmountOfMoney $ currencyOnly JOD
|
||||||
|
"عراق" -> Just . Token AmountOfMoney $ currencyOnly IQD
|
||||||
|
_ -> Nothing
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleOtherDirhams :: Rule
|
||||||
|
ruleOtherDirhams = Rule
|
||||||
|
{ name = "dirham"
|
||||||
|
, pattern =
|
||||||
|
[ regex "(درهم|دراهم) (اردن|أردن|مغرب)ي?[ةه]?"
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token RegexMatch (GroupMatch (_:match:_)):
|
||||||
|
_) -> case Text.toLower match of
|
||||||
|
"إمارات" -> Just . Token AmountOfMoney $ currencyOnly AED
|
||||||
|
"امارات" -> Just . Token AmountOfMoney $ currencyOnly AED
|
||||||
|
"مغرب" -> Just . Token AmountOfMoney $ currencyOnly MAD
|
||||||
|
_ -> Nothing
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleOtherRiyals :: Rule
|
||||||
|
ruleOtherRiyals = Rule
|
||||||
|
{ name = "riyals"
|
||||||
|
, pattern =
|
||||||
|
[ regex "(ريال|ريالات) (سعود|قطر)ي?[ةه]?"
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token RegexMatch (GroupMatch (_:match:_)):
|
||||||
|
_) -> case Text.toLower match of
|
||||||
|
"قطر" -> Just . Token AmountOfMoney $ currencyOnly QAR
|
||||||
|
"سعود" -> Just . Token AmountOfMoney $ currencyOnly SAR
|
||||||
|
_ -> Nothing
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleCent :: Rule
|
||||||
|
ruleCent = Rule
|
||||||
|
{ name = "cent"
|
||||||
|
, pattern =
|
||||||
|
[ regex "سي?نت(ات)?"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleLBP :: Rule
|
||||||
|
ruleLBP = Rule
|
||||||
|
{ name = "LBP"
|
||||||
|
, pattern =
|
||||||
|
[ regex "لير([ةه]|ات) لبناني[ةه]?"
|
||||||
|
]
|
||||||
|
, prod = \_ -> Just . Token AmountOfMoney $ currencyOnly LBP
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntersectAndXCents :: Rule
|
||||||
|
ruleIntersectAndXCents = Rule
|
||||||
|
{ name = "intersect (and X cents)"
|
||||||
|
, pattern =
|
||||||
|
[ financeWith TAmountOfMoney.value isJust
|
||||||
|
, regex "و"
|
||||||
|
, financeWith TAmountOfMoney.currency (== Cent)
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token AmountOfMoney fd:
|
||||||
|
_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just c}:
|
||||||
|
_) -> Just . Token AmountOfMoney $ withCents c fd
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntersect :: Rule
|
||||||
|
ruleIntersect = Rule
|
||||||
|
{ name = "intersect"
|
||||||
|
, pattern =
|
||||||
|
[ financeWith TAmountOfMoney.value isJust
|
||||||
|
, dimension Numeral
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token AmountOfMoney fd:
|
||||||
|
Token Numeral NumeralData {TNumeral.value = c}:
|
||||||
|
_) -> Just . Token AmountOfMoney $ withCents c fd
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntersectAndNumeral :: Rule
|
||||||
|
ruleIntersectAndNumeral = Rule
|
||||||
|
{ name = "intersect (and number)"
|
||||||
|
, pattern =
|
||||||
|
[ financeWith TAmountOfMoney.value isJust
|
||||||
|
, regex "و"
|
||||||
|
, dimension Numeral
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token AmountOfMoney fd:
|
||||||
|
_:
|
||||||
|
Token Numeral NumeralData {TNumeral.value = c}:
|
||||||
|
_) -> Just . Token AmountOfMoney $ withCents c fd
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntersectXCents :: Rule
|
||||||
|
ruleIntersectXCents = Rule
|
||||||
|
{ name = "intersect (X cents)"
|
||||||
|
, pattern =
|
||||||
|
[ financeWith TAmountOfMoney.value isJust
|
||||||
|
, financeWith id $ \x -> case TAmountOfMoney.value x of
|
||||||
|
Just v | v > 0 -> TAmountOfMoney.currency x == Cent
|
||||||
|
_ -> False
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token AmountOfMoney fd:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just c}:
|
||||||
|
_) -> Just . Token AmountOfMoney $ withCents c fd
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
rulePrecision :: Rule
|
||||||
|
rulePrecision = Rule
|
||||||
|
{ name = "about|exactly <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ regex "حوال[ي|ى]|تقريبا|بحدود"
|
||||||
|
, dimension AmountOfMoney
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(_:token:_) -> Just token
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalBetweenNumeral :: Rule
|
||||||
|
ruleIntervalBetweenNumeral = Rule
|
||||||
|
{ name = "between|from <numeral> to|and <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ regex "(من|(ما )?بين)( ال)?"
|
||||||
|
, dimension Numeral
|
||||||
|
, regex "(الى|حتى|و|ل)( ا?ل)?"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(_:
|
||||||
|
Token Numeral NumeralData {TNumeral.value = from}:
|
||||||
|
_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c}:
|
||||||
|
_) ->
|
||||||
|
Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalBetween :: Rule
|
||||||
|
ruleIntervalBetween = Rule
|
||||||
|
{ name = "between|from <amount-of-money> to|and <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ regex "(من|(ما )?بين)( ال)?"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
, regex "(الى|حتى|و|ل)( ا?ل)?"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just from, TAmountOfMoney.currency = c1}:
|
||||||
|
_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c2}:
|
||||||
|
_) | c1 == c2 ->
|
||||||
|
Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalNumeralDash :: Rule
|
||||||
|
ruleIntervalNumeralDash = Rule
|
||||||
|
{ name = "<numeral> - <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ dimension Numeral
|
||||||
|
, regex "-"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token Numeral NumeralData {TNumeral.value = from}:
|
||||||
|
_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c}:
|
||||||
|
_) ->
|
||||||
|
Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalDash :: Rule
|
||||||
|
ruleIntervalDash = Rule
|
||||||
|
{ name = "<amount-of-money> - <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ financeWith TAmountOfMoney.value isJust
|
||||||
|
, regex "-"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just from, TAmountOfMoney.currency = c1}:
|
||||||
|
_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c2}:
|
||||||
|
_) | c1 == c2 ->
|
||||||
|
Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalMax :: Rule
|
||||||
|
ruleIntervalMax = Rule
|
||||||
|
{ name = "under/less/lower/no more than <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ regex "(حتى|[أا]قل من|تحت|(ما )?دون)|على ال[أا]كثر"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c}:
|
||||||
|
_) -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalAtMost :: Rule
|
||||||
|
ruleIntervalAtMost = Rule
|
||||||
|
{ name = "under/less/lower/no more than <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ regex "على ال[أا]كثر"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c}:
|
||||||
|
_) -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalMin :: Rule
|
||||||
|
ruleIntervalMin = Rule
|
||||||
|
{ name = "at least/over/above/more than <amount-of-money>"
|
||||||
|
, pattern =
|
||||||
|
[ regex "فوق||[أا]كثر من|على ال[اأ]قل"
|
||||||
|
, financeWith TAmountOfMoney.value isJust
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(_:
|
||||||
|
Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c}:
|
||||||
|
_) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
ruleIntervalAtLeast :: Rule
|
||||||
|
ruleIntervalAtLeast = Rule
|
||||||
|
{ name = "<amount-of-money> at least"
|
||||||
|
, pattern =
|
||||||
|
[ financeWith TAmountOfMoney.value isJust
|
||||||
|
, regex "على ال[اأ]قل"
|
||||||
|
]
|
||||||
|
, prod = \tokens -> case tokens of
|
||||||
|
(Token AmountOfMoney AmountOfMoneyData {TAmountOfMoney.value = Just to, TAmountOfMoney.currency = c}:
|
||||||
|
_) -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
|
||||||
|
_ -> Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
rules :: [Rule]
|
||||||
|
rules =
|
||||||
|
[ ruleCent
|
||||||
|
, rulePounds
|
||||||
|
, ruleDinars
|
||||||
|
, ruleDirhams
|
||||||
|
, ruleRiyals
|
||||||
|
, ruleDollars
|
||||||
|
, ruleShekel
|
||||||
|
, ruleEuro
|
||||||
|
, ruleOtherPounds
|
||||||
|
, ruleOtherDinars
|
||||||
|
, ruleOtherDirhams
|
||||||
|
, ruleOtherRiyals
|
||||||
|
, ruleLBP
|
||||||
|
, ruleIntersect
|
||||||
|
, ruleIntersectAndNumeral
|
||||||
|
, ruleIntersectAndXCents
|
||||||
|
, ruleIntersectXCents
|
||||||
|
, ruleIntervalBetweenNumeral
|
||||||
|
, ruleIntervalBetween
|
||||||
|
, ruleIntervalMax
|
||||||
|
, ruleIntervalAtMost
|
||||||
|
, ruleIntervalMin
|
||||||
|
, ruleIntervalAtLeast
|
||||||
|
, ruleIntervalNumeralDash
|
||||||
|
, ruleIntervalDash
|
||||||
|
, rulePrecision
|
||||||
|
]
|
@ -146,6 +146,21 @@ allExamples = concat
|
|||||||
, "20 ringgit 43"
|
, "20 ringgit 43"
|
||||||
, "twenty ringgit and 43"
|
, "twenty ringgit and 43"
|
||||||
]
|
]
|
||||||
|
, examples (simple Dinar 10)
|
||||||
|
[ "10 dinars"
|
||||||
|
]
|
||||||
|
, examples (simple ILS 10)
|
||||||
|
[ "ten shekels"
|
||||||
|
, "10 ILS"
|
||||||
|
]
|
||||||
|
, examples (simple Riyal 10)
|
||||||
|
[ "ten riyals"
|
||||||
|
, "10 riyals"
|
||||||
|
]
|
||||||
|
, examples (simple Rial 10)
|
||||||
|
[ "ten rials"
|
||||||
|
, "10 rials"
|
||||||
|
]
|
||||||
, examples (between Dollar (10, 20))
|
, examples (between Dollar (10, 20))
|
||||||
[ "between 10 and 20 dollars"
|
[ "between 10 and 20 dollars"
|
||||||
, "from 10 dollars to 20 dollars"
|
, "from 10 dollars to 20 dollars"
|
||||||
|
@ -10,21 +10,22 @@
|
|||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
module Duckling.AmountOfMoney.EN.Rules
|
module Duckling.AmountOfMoney.EN.Rules
|
||||||
( rules ) where
|
( rules
|
||||||
|
) where
|
||||||
|
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import qualified Data.Text as Text
|
|
||||||
import Prelude
|
|
||||||
import Data.String
|
import Data.String
|
||||||
|
import Prelude
|
||||||
|
import qualified Data.Text as Text
|
||||||
|
|
||||||
import Duckling.AmountOfMoney.Helpers
|
import Duckling.AmountOfMoney.Helpers
|
||||||
import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
|
import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
|
||||||
import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
|
|
||||||
import Duckling.Dimensions.Types
|
import Duckling.Dimensions.Types
|
||||||
import Duckling.Numeral.Types (NumeralData (..))
|
import Duckling.Numeral.Types (NumeralData (..))
|
||||||
import qualified Duckling.Numeral.Types as TNumeral
|
|
||||||
import Duckling.Regex.Types
|
import Duckling.Regex.Types
|
||||||
import Duckling.Types
|
import Duckling.Types
|
||||||
|
import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
|
||||||
|
import qualified Duckling.Numeral.Types as TNumeral
|
||||||
|
|
||||||
rulePounds :: Rule
|
rulePounds :: Rule
|
||||||
rulePounds = Rule
|
rulePounds = Rule
|
||||||
@ -72,7 +73,7 @@ ruleDinars = Rule
|
|||||||
, prod = \tokens -> case tokens of
|
, prod = \tokens -> case tokens of
|
||||||
(Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
|
(Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
|
||||||
"kuwaiti" -> Just . Token AmountOfMoney $ currencyOnly KWD
|
"kuwaiti" -> Just . Token AmountOfMoney $ currencyOnly KWD
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +121,9 @@ ruleACurrency = Rule
|
|||||||
, financeWith TAmountOfMoney.value isNothing
|
, financeWith TAmountOfMoney.value isNothing
|
||||||
]
|
]
|
||||||
, prod = \tokens -> case tokens of
|
, prod = \tokens -> case tokens of
|
||||||
(_:Token AmountOfMoney fd:_) -> Just . Token AmountOfMoney $ fd {TAmountOfMoney.value = Just 1}
|
(_:
|
||||||
|
Token AmountOfMoney fd:
|
||||||
|
_) -> Just . Token AmountOfMoney $ fd {TAmountOfMoney.value = Just 1}
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,4 +65,13 @@ allExamples = concat
|
|||||||
[ "GBP3,01"
|
[ "GBP3,01"
|
||||||
, "GBP 3,01"
|
, "GBP 3,01"
|
||||||
]
|
]
|
||||||
|
, examples (simple ILS 10)
|
||||||
|
[ "dix shekels"
|
||||||
|
]
|
||||||
|
, examples (simple Rial 10)
|
||||||
|
[ "dix rials"
|
||||||
|
]
|
||||||
|
, examples (simple Riyal 10)
|
||||||
|
[ "dix riyals"
|
||||||
|
]
|
||||||
]
|
]
|
||||||
|
@ -40,6 +40,8 @@ currencies = HashMap.fromList
|
|||||||
, ("¢", Cent)
|
, ("¢", Cent)
|
||||||
, ("c", Cent)
|
, ("c", Cent)
|
||||||
, ("$", Dollar)
|
, ("$", Dollar)
|
||||||
|
, ("dinar", Dinar)
|
||||||
|
, ("dinars", Dinar)
|
||||||
, ("dollar", Dollar)
|
, ("dollar", Dollar)
|
||||||
, ("dollars", Dollar)
|
, ("dollars", Dollar)
|
||||||
, ("egp", EGP)
|
, ("egp", EGP)
|
||||||
@ -55,17 +57,21 @@ currencies = HashMap.fromList
|
|||||||
, ("gbp", GBP)
|
, ("gbp", GBP)
|
||||||
, ("hrk", HRK)
|
, ("hrk", HRK)
|
||||||
, ("idr", IDR)
|
, ("idr", IDR)
|
||||||
|
, ("ils", ILS)
|
||||||
, ("inr", INR)
|
, ("inr", INR)
|
||||||
|
, ("iqd", IQD)
|
||||||
, ("rs", INR)
|
, ("rs", INR)
|
||||||
, ("rs.", INR)
|
, ("rs.", INR)
|
||||||
, ("rupee", INR)
|
, ("rupee", INR)
|
||||||
, ("rupees", INR)
|
, ("rupees", INR)
|
||||||
|
, ("jod", JOD)
|
||||||
, ("¥", JPY)
|
, ("¥", JPY)
|
||||||
, ("jpy", JPY)
|
, ("jpy", JPY)
|
||||||
, ("yen", JPY)
|
, ("yen", JPY)
|
||||||
, ("krw", KRW)
|
, ("krw", KRW)
|
||||||
, ("kwd", KWD)
|
, ("kwd", KWD)
|
||||||
, ("lbp", LBP)
|
, ("lbp", LBP)
|
||||||
|
, ("mad", MAD)
|
||||||
, ("myr", MYR)
|
, ("myr", MYR)
|
||||||
, ("rm", MYR)
|
, ("rm", MYR)
|
||||||
, ("nok", NOK)
|
, ("nok", NOK)
|
||||||
@ -76,11 +82,17 @@ currencies = HashMap.fromList
|
|||||||
, ("pts", PTS)
|
, ("pts", PTS)
|
||||||
, ("qar", QAR)
|
, ("qar", QAR)
|
||||||
, ("₽", RUB)
|
, ("₽", RUB)
|
||||||
|
, ("rial", Rial)
|
||||||
|
, ("rials", Rial)
|
||||||
|
, ("riyal", Riyal)
|
||||||
|
, ("riyals", Riyal)
|
||||||
, ("ron", RON)
|
, ("ron", RON)
|
||||||
, ("rub", RUB)
|
, ("rub", RUB)
|
||||||
, ("sar", SAR)
|
, ("sar", SAR)
|
||||||
, ("sek", SEK)
|
, ("sek", SEK)
|
||||||
, ("sgd", SGD)
|
, ("sgd", SGD)
|
||||||
|
, ("shekel", ILS)
|
||||||
|
, ("shekels", ILS)
|
||||||
, ("usd", USD)
|
, ("usd", USD)
|
||||||
, ("us$", USD)
|
, ("us$", USD)
|
||||||
, ("vnd", VND)
|
, ("vnd", VND)
|
||||||
@ -90,7 +102,7 @@ ruleCurrencies :: Rule
|
|||||||
ruleCurrencies = Rule
|
ruleCurrencies = Rule
|
||||||
{ name = "currencies"
|
{ name = "currencies"
|
||||||
, pattern =
|
, pattern =
|
||||||
[ regex "(aed|aud|bgn|brl|byn|¢|c|\\$|dollars?|egp|(e|€)uro?s?|€|gbp|hrk|idr|inr|¥|jpy|krw|kwd|lbp|myr|rm|nok|£|pta?s?|qar|₽|rs\\.?|ron|rub|rupees?|sar|sek|sgb|us(d|\\$)|vnd|yen)"
|
[ regex "(aed|aud|bgn|brl|byn|¢|c|\\$|dinars?|dollars?|egp|(e|€)uro?s?|€|gbp|hrk|idr|ils|inr|iqd|jod|¥|jpy|krw|kwd|lbp|mad|myr|rm|nok|£|pta?s?|qar|₽|rs\\.?|riy?als?|ron|rub|rupees?|sar|sek|sgb|shekels?|us(d|\\$)|vnd|yen)"
|
||||||
]
|
]
|
||||||
, prod = \tokens -> case tokens of
|
, prod = \tokens -> case tokens of
|
||||||
(Token RegexMatch (GroupMatch (match:_)):_) -> do
|
(Token RegexMatch (GroupMatch (match:_)):_) -> do
|
||||||
|
@ -28,8 +28,12 @@ import Duckling.Resolve (Resolve(..))
|
|||||||
data Currency
|
data Currency
|
||||||
-- ambiguous
|
-- ambiguous
|
||||||
= Cent
|
= Cent
|
||||||
|
| Dinar
|
||||||
|
| Dirham
|
||||||
| Dollar
|
| Dollar
|
||||||
| Pound
|
| Pound
|
||||||
|
| Rial
|
||||||
|
| Riyal
|
||||||
| Unnamed -- e.g. bucks
|
| Unnamed -- e.g. bucks
|
||||||
-- unambiguous
|
-- unambiguous
|
||||||
| AED
|
| AED
|
||||||
@ -42,11 +46,15 @@ data Currency
|
|||||||
| GBP
|
| GBP
|
||||||
| HRK
|
| HRK
|
||||||
| IDR
|
| IDR
|
||||||
|
| ILS
|
||||||
| INR
|
| INR
|
||||||
|
| IQD
|
||||||
|
| JOD
|
||||||
| JPY
|
| JPY
|
||||||
| KRW
|
| KRW
|
||||||
| KWD
|
| KWD
|
||||||
| LBP
|
| LBP
|
||||||
|
| MAD
|
||||||
| MYR
|
| MYR
|
||||||
| NOK
|
| NOK
|
||||||
| PTS
|
| PTS
|
||||||
@ -64,6 +72,10 @@ instance ToJSON Currency where
|
|||||||
toJSON Cent = "cent"
|
toJSON Cent = "cent"
|
||||||
toJSON Dollar = "$"
|
toJSON Dollar = "$"
|
||||||
toJSON Pound = "\x00a3"
|
toJSON Pound = "\x00a3"
|
||||||
|
toJSON Dinar = "dinar"
|
||||||
|
toJSON Dirham = "dirham"
|
||||||
|
toJSON Rial = "rial"
|
||||||
|
toJSON Riyal = "riyal"
|
||||||
toJSON Unnamed = "unknown"
|
toJSON Unnamed = "unknown"
|
||||||
toJSON AED = "AED"
|
toJSON AED = "AED"
|
||||||
toJSON AUD = "AUD"
|
toJSON AUD = "AUD"
|
||||||
@ -75,11 +87,15 @@ instance ToJSON Currency where
|
|||||||
toJSON GBP = "GBP"
|
toJSON GBP = "GBP"
|
||||||
toJSON HRK = "HRK"
|
toJSON HRK = "HRK"
|
||||||
toJSON IDR = "IDR"
|
toJSON IDR = "IDR"
|
||||||
|
toJSON ILS = "ILS"
|
||||||
|
toJSON IQD = "IQD"
|
||||||
toJSON INR = "INR"
|
toJSON INR = "INR"
|
||||||
|
toJSON JOD = "JOD"
|
||||||
toJSON JPY = "JPY"
|
toJSON JPY = "JPY"
|
||||||
toJSON KRW = "KRW"
|
toJSON KRW = "KRW"
|
||||||
toJSON KWD = "KWD"
|
toJSON KWD = "KWD"
|
||||||
toJSON LBP = "LBP"
|
toJSON LBP = "LBP"
|
||||||
|
toJSON MAD = "MAD"
|
||||||
toJSON MYR = "MYR"
|
toJSON MYR = "MYR"
|
||||||
toJSON NOK = "NOK"
|
toJSON NOK = "NOK"
|
||||||
toJSON PTS = "PTS"
|
toJSON PTS = "PTS"
|
||||||
|
@ -18,6 +18,7 @@ module Duckling.Rules.AR
|
|||||||
import Duckling.Dimensions.Types
|
import Duckling.Dimensions.Types
|
||||||
import Duckling.Locale
|
import Duckling.Locale
|
||||||
import Duckling.Types
|
import Duckling.Types
|
||||||
|
import qualified Duckling.AmountOfMoney.AR.Rules as AmountOfMoney
|
||||||
import qualified Duckling.Duration.AR.Rules as Duration
|
import qualified Duckling.Duration.AR.Rules as Duration
|
||||||
import qualified Duckling.Numeral.AR.Rules as Numeral
|
import qualified Duckling.Numeral.AR.Rules as Numeral
|
||||||
import qualified Duckling.Ordinal.AR.Rules as Ordinal
|
import qualified Duckling.Ordinal.AR.Rules as Ordinal
|
||||||
@ -34,7 +35,7 @@ localeRules :: Region -> Some Dimension -> [Rule]
|
|||||||
localeRules _ _ = []
|
localeRules _ _ = []
|
||||||
|
|
||||||
langRules :: Some Dimension -> [Rule]
|
langRules :: Some Dimension -> [Rule]
|
||||||
langRules (This AmountOfMoney) = []
|
langRules (This AmountOfMoney) = AmountOfMoney.rules
|
||||||
langRules (This Distance) = []
|
langRules (This Distance) = []
|
||||||
langRules (This Duration) = Duration.rules
|
langRules (This Duration) = Duration.rules
|
||||||
langRules (This Email) = []
|
langRules (This Email) = []
|
||||||
|
@ -158,6 +158,8 @@ library
|
|||||||
, Duckling.Dimensions.ZH
|
, Duckling.Dimensions.ZH
|
||||||
|
|
||||||
-- AmountOfMoney
|
-- AmountOfMoney
|
||||||
|
, Duckling.AmountOfMoney.AR.Corpus
|
||||||
|
, Duckling.AmountOfMoney.AR.Rules
|
||||||
, Duckling.AmountOfMoney.EN.Corpus
|
, Duckling.AmountOfMoney.EN.Corpus
|
||||||
, Duckling.AmountOfMoney.EN.Rules
|
, Duckling.AmountOfMoney.EN.Rules
|
||||||
, Duckling.AmountOfMoney.BG.Corpus
|
, Duckling.AmountOfMoney.BG.Corpus
|
||||||
@ -646,6 +648,7 @@ test-suite duckling-test
|
|||||||
, Duckling.Dimensions.Tests
|
, Duckling.Dimensions.Tests
|
||||||
|
|
||||||
-- AmountOfMoney
|
-- AmountOfMoney
|
||||||
|
, Duckling.AmountOfMoney.AR.Tests
|
||||||
, Duckling.AmountOfMoney.EN.Tests
|
, Duckling.AmountOfMoney.EN.Tests
|
||||||
, Duckling.AmountOfMoney.BG.Tests
|
, Duckling.AmountOfMoney.BG.Tests
|
||||||
, Duckling.AmountOfMoney.ES.Tests
|
, Duckling.AmountOfMoney.ES.Tests
|
||||||
|
24
tests/Duckling/AmountOfMoney/AR/Tests.hs
Normal file
24
tests/Duckling/AmountOfMoney/AR/Tests.hs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
-- 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. An additional grant
|
||||||
|
-- of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
|
||||||
|
module Duckling.AmountOfMoney.AR.Tests
|
||||||
|
( tests
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Data.String
|
||||||
|
import Prelude
|
||||||
|
import Test.Tasty
|
||||||
|
|
||||||
|
import Duckling.AmountOfMoney.AR.Corpus
|
||||||
|
import Duckling.Dimensions.Types
|
||||||
|
import Duckling.Testing.Asserts
|
||||||
|
|
||||||
|
tests :: TestTree
|
||||||
|
tests = testGroup "AR Tests"
|
||||||
|
[ makeCorpusTest [This AmountOfMoney] corpus
|
||||||
|
]
|
@ -7,7 +7,8 @@
|
|||||||
|
|
||||||
|
|
||||||
module Duckling.AmountOfMoney.EN.Tests
|
module Duckling.AmountOfMoney.EN.Tests
|
||||||
( tests ) where
|
( tests
|
||||||
|
) where
|
||||||
|
|
||||||
import Data.String
|
import Data.String
|
||||||
import Prelude
|
import Prelude
|
||||||
|
@ -12,6 +12,7 @@ import Data.String
|
|||||||
import Prelude
|
import Prelude
|
||||||
import Test.Tasty
|
import Test.Tasty
|
||||||
|
|
||||||
|
import qualified Duckling.AmountOfMoney.AR.Tests as AR
|
||||||
import qualified Duckling.AmountOfMoney.EN.Tests as EN
|
import qualified Duckling.AmountOfMoney.EN.Tests as EN
|
||||||
import qualified Duckling.AmountOfMoney.BG.Tests as BG
|
import qualified Duckling.AmountOfMoney.BG.Tests as BG
|
||||||
import qualified Duckling.AmountOfMoney.ES.Tests as ES
|
import qualified Duckling.AmountOfMoney.ES.Tests as ES
|
||||||
@ -29,7 +30,8 @@ import qualified Duckling.AmountOfMoney.VI.Tests as VI
|
|||||||
|
|
||||||
tests :: TestTree
|
tests :: TestTree
|
||||||
tests = testGroup "AmountOfMoney Tests"
|
tests = testGroup "AmountOfMoney Tests"
|
||||||
[ EN.tests
|
[ AR.tests
|
||||||
|
, EN.tests
|
||||||
, BG.tests
|
, BG.tests
|
||||||
, ES.tests
|
, ES.tests
|
||||||
, FR.tests
|
, FR.tests
|
||||||
|
Loading…
Reference in New Issue
Block a user