mirror of
https://github.com/facebook/duckling.git
synced 2024-09-11 21:27:13 +03:00
swahili numerical support
Summary: Adding support for swahili numerals Reviewed By: patapizza Differential Revision: D13637092 fbshipit-source-id: 6fe0facfa74caae6fd00e0e84b09571aca616f21
This commit is contained in:
parent
a707be9eae
commit
392e584d1b
@ -58,6 +58,7 @@ import qualified Duckling.Dimensions.PT as PTDimensions
|
||||
import qualified Duckling.Dimensions.RO as RODimensions
|
||||
import qualified Duckling.Dimensions.RU as RUDimensions
|
||||
import qualified Duckling.Dimensions.SV as SVDimensions
|
||||
import qualified Duckling.Dimensions.SW as SWDimensions
|
||||
import qualified Duckling.Dimensions.TA as TADimensions
|
||||
import qualified Duckling.Dimensions.TR as TRDimensions
|
||||
import qualified Duckling.Dimensions.UK as UKDimensions
|
||||
@ -131,6 +132,7 @@ langDimensions PT = PTDimensions.allDimensions
|
||||
langDimensions RO = RODimensions.allDimensions
|
||||
langDimensions RU = RUDimensions.allDimensions
|
||||
langDimensions SV = SVDimensions.allDimensions
|
||||
langDimensions SW = SWDimensions.allDimensions
|
||||
langDimensions TA = TADimensions.allDimensions
|
||||
langDimensions TR = TRDimensions.allDimensions
|
||||
langDimensions UK = UKDimensions.allDimensions
|
||||
|
18
Duckling/Dimensions/SW.hs
Normal file
18
Duckling/Dimensions/SW.hs
Normal file
@ -0,0 +1,18 @@
|
||||
-- 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.Dimensions.SW
|
||||
( allDimensions
|
||||
) where
|
||||
|
||||
import Duckling.Dimensions.Types
|
||||
|
||||
allDimensions :: [Some Dimension]
|
||||
allDimensions =
|
||||
[ This Numeral
|
||||
]
|
@ -70,6 +70,7 @@ data Lang
|
||||
| RO
|
||||
| RU
|
||||
| SV
|
||||
| SW
|
||||
| TA
|
||||
| TR
|
||||
| UK
|
||||
|
87
Duckling/Numeral/SW/Corpus.hs
Normal file
87
Duckling/Numeral/SW/Corpus.hs
Normal file
@ -0,0 +1,87 @@
|
||||
-- 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.Numeral.SW.Corpus
|
||||
( corpus ) where
|
||||
|
||||
import Data.String
|
||||
import Prelude
|
||||
|
||||
import Duckling.Locale
|
||||
import Duckling.Numeral.Types
|
||||
import Duckling.Resolve
|
||||
import Duckling.Testing.Types
|
||||
|
||||
corpus :: Corpus
|
||||
corpus = (testContext {locale = makeLocale SW Nothing}, testOptions, allExamples)
|
||||
|
||||
allExamples :: [Example]
|
||||
allExamples = concat
|
||||
[ examples (NumeralValue 0)
|
||||
[ "0"
|
||||
, "sufuri"
|
||||
, "zero"
|
||||
]
|
||||
, examples (NumeralValue 1)
|
||||
[ "moja"
|
||||
]
|
||||
, examples (NumeralValue 2)
|
||||
[ "mbili"
|
||||
]
|
||||
, examples (NumeralValue 3)
|
||||
[ "tatu"
|
||||
]
|
||||
, examples (NumeralValue 4)
|
||||
[ "nne"
|
||||
]
|
||||
, examples (NumeralValue 5)
|
||||
[ "tano"
|
||||
]
|
||||
, examples (NumeralValue 6)
|
||||
[ "sita"
|
||||
]
|
||||
, examples (NumeralValue 7)
|
||||
[ "saba"
|
||||
]
|
||||
, examples (NumeralValue 8)
|
||||
[ "nane"
|
||||
]
|
||||
, examples (NumeralValue 9)
|
||||
[ "tisa"
|
||||
]
|
||||
, examples (NumeralValue 10)
|
||||
[ "kumi"
|
||||
]
|
||||
, examples (NumeralValue 20)
|
||||
[ "ishirini"
|
||||
]
|
||||
, examples (NumeralValue 30)
|
||||
[ "thelathini"
|
||||
]
|
||||
, examples (NumeralValue 40)
|
||||
[ "arubaini"
|
||||
, "arobaini"
|
||||
]
|
||||
, examples (NumeralValue 50)
|
||||
[ "hamsini"
|
||||
]
|
||||
, examples (NumeralValue 60)
|
||||
[ "sitini"
|
||||
]
|
||||
, examples (NumeralValue 70)
|
||||
[ "sabini"
|
||||
]
|
||||
, examples (NumeralValue 80)
|
||||
[ "themanini"
|
||||
]
|
||||
, examples (NumeralValue 90)
|
||||
[ "tisini"
|
||||
]
|
||||
]
|
105
Duckling/Numeral/SW/Rules.hs
Normal file
105
Duckling/Numeral/SW/Rules.hs
Normal file
@ -0,0 +1,105 @@
|
||||
-- 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 #-}
|
||||
{-# LANGUAGE NoRebindableSyntax #-}
|
||||
|
||||
module Duckling.Numeral.SW.Rules
|
||||
( rules
|
||||
) where
|
||||
|
||||
import Data.HashMap.Strict (HashMap)
|
||||
import Data.Maybe
|
||||
import Data.String
|
||||
import Data.Text (Text)
|
||||
import Prelude
|
||||
import qualified Data.HashMap.Strict as HashMap
|
||||
import qualified Data.Text as Text
|
||||
|
||||
import Duckling.Dimensions.Types
|
||||
import Duckling.Numeral.Helpers
|
||||
import Duckling.Numeral.Types (NumeralData (..))
|
||||
import Duckling.Regex.Types
|
||||
import Duckling.Types
|
||||
import qualified Duckling.Numeral.Types as TNumeral
|
||||
|
||||
ruleNumeralMap :: HashMap Text Integer
|
||||
ruleNumeralMap = HashMap.fromList
|
||||
[ ( "sufuri", 0 )
|
||||
, ( "zero", 0 )
|
||||
, ( "moja", 1 )
|
||||
, ( "mbili", 2 )
|
||||
, ( "tatu", 3 )
|
||||
, ( "nne", 4 )
|
||||
, ( "tano", 5)
|
||||
, ( "sita", 6)
|
||||
, ( "saba", 7)
|
||||
, ( "nane", 8)
|
||||
, ( "tisa", 9)
|
||||
, ( "kumi", 10)
|
||||
]
|
||||
|
||||
ruleNumeral :: Rule
|
||||
ruleNumeral = Rule
|
||||
{ name = "number (0..10)"
|
||||
, pattern =
|
||||
[ regex "(sufuri|zero|moja|mbili|tatu|nne|tano|sita|saba|nane|tisa|kumi)"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token RegexMatch (GroupMatch (match:_)):_) ->
|
||||
HashMap.lookup (Text.toLower match) ruleNumeralMap >>= integer
|
||||
_ -> Nothing
|
||||
}
|
||||
|
||||
tensMap :: HashMap Text Integer
|
||||
tensMap = HashMap.fromList
|
||||
[ ( "ishirini", 20 )
|
||||
, ( "thelathini", 30 )
|
||||
, ( "arubaini", 40 )
|
||||
, ( "arobaini", 40 )
|
||||
, ( "hamsini", 50 )
|
||||
, ( "sitini", 60 )
|
||||
, ( "sabini", 70 )
|
||||
, ( "themanini", 80 )
|
||||
, ( "tisini", 90 )
|
||||
]
|
||||
|
||||
ruleTens :: Rule
|
||||
ruleTens = Rule
|
||||
{ name = "integer (20,30..90)"
|
||||
, pattern =
|
||||
[ regex "(ishirini|thelathini|arubaini|arobaini|hamsini|sitini|sabini|themanini|tisini)"
|
||||
]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token RegexMatch (GroupMatch (match:_)):_) ->
|
||||
HashMap.lookup (Text.toLower match) tensMap >>= integer
|
||||
_ -> Nothing
|
||||
}
|
||||
|
||||
|
||||
ruleCompositeTens :: Rule
|
||||
ruleCompositeTens = Rule
|
||||
{ name = "integer 11..19 21..29 .. 91..99"
|
||||
, pattern = [oneOf [20,30..90]
|
||||
, regex "-?na-?"
|
||||
, numberBetween 1 10]
|
||||
, prod = \tokens -> case tokens of
|
||||
(Token Numeral NumeralData{TNumeral.value = v1}:
|
||||
Token Numeral NumeralData{TNumeral.value = v2}:
|
||||
_) -> double $ v1 + v2
|
||||
_ -> Nothing
|
||||
}
|
||||
|
||||
|
||||
rules :: [Rule]
|
||||
rules =
|
||||
[ ruleNumeral
|
||||
, ruleTens
|
||||
, ruleCompositeTens
|
||||
]
|
@ -52,6 +52,7 @@ import qualified Duckling.Ranking.Classifiers.PT_XX as PT_XXClassifiers
|
||||
import qualified Duckling.Ranking.Classifiers.RO_XX as RO_XXClassifiers
|
||||
import qualified Duckling.Ranking.Classifiers.RU_XX as RU_XXClassifiers
|
||||
import qualified Duckling.Ranking.Classifiers.SV_XX as SV_XXClassifiers
|
||||
import qualified Duckling.Ranking.Classifiers.SW_XX as SW_XXClassifiers
|
||||
import qualified Duckling.Ranking.Classifiers.TA_XX as TA_XXClassifiers
|
||||
import qualified Duckling.Ranking.Classifiers.TR_XX as TR_XXClassifiers
|
||||
import qualified Duckling.Ranking.Classifiers.UK_XX as UK_XXClassifiers
|
||||
@ -97,6 +98,7 @@ classifiers (Locale PT _) = PT_XXClassifiers.classifiers
|
||||
classifiers (Locale RO _) = RO_XXClassifiers.classifiers
|
||||
classifiers (Locale RU _) = RU_XXClassifiers.classifiers
|
||||
classifiers (Locale SV _) = SV_XXClassifiers.classifiers
|
||||
classifiers (Locale SW _) = SW_XXClassifiers.classifiers
|
||||
classifiers (Locale TA _) = TA_XXClassifiers.classifiers
|
||||
classifiers (Locale TR _) = TR_XXClassifiers.classifiers
|
||||
classifiers (Locale UK _) = UK_XXClassifiers.classifiers
|
||||
|
22
Duckling/Ranking/Classifiers/SW_XX.hs
Normal file
22
Duckling/Ranking/Classifiers/SW_XX.hs
Normal file
@ -0,0 +1,22 @@
|
||||
-- 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.
|
||||
|
||||
-----------------------------------------------------------------
|
||||
-- Auto-generated by regenClassifiers
|
||||
--
|
||||
-- DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||
-- @generated
|
||||
-----------------------------------------------------------------
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
module Duckling.Ranking.Classifiers.SW_XX (classifiers) where
|
||||
import Data.String
|
||||
import Prelude
|
||||
import qualified Data.HashMap.Strict as HashMap
|
||||
import Duckling.Ranking.Types
|
||||
|
||||
classifiers :: Classifiers
|
||||
classifiers = HashMap.fromList []
|
@ -59,6 +59,7 @@ import qualified Duckling.Rules.PT as PTRules
|
||||
import qualified Duckling.Rules.RO as RORules
|
||||
import qualified Duckling.Rules.RU as RURules
|
||||
import qualified Duckling.Rules.SV as SVRules
|
||||
import qualified Duckling.Rules.SW as SWRules
|
||||
import qualified Duckling.Rules.TA as TARules
|
||||
import qualified Duckling.Rules.TR as TRRules
|
||||
import qualified Duckling.Rules.UK as UKRules
|
||||
@ -122,6 +123,7 @@ defaultRules PT = PTRules.defaultRules
|
||||
defaultRules RO = RORules.defaultRules
|
||||
defaultRules RU = RURules.defaultRules
|
||||
defaultRules SV = SVRules.defaultRules
|
||||
defaultRules SW = SWRules.defaultRules
|
||||
defaultRules TA = TARules.defaultRules
|
||||
defaultRules TR = TRRules.defaultRules
|
||||
defaultRules UK = UKRules.defaultRules
|
||||
@ -165,6 +167,7 @@ localeRules PT = PTRules.localeRules
|
||||
localeRules RO = RORules.localeRules
|
||||
localeRules RU = RURules.localeRules
|
||||
localeRules SV = SVRules.localeRules
|
||||
localeRules SW = SWRules.localeRules
|
||||
localeRules TA = TARules.localeRules
|
||||
localeRules TR = TRRules.localeRules
|
||||
localeRules UK = UKRules.localeRules
|
||||
@ -208,6 +211,7 @@ langRules PT = PTRules.langRules
|
||||
langRules RO = RORules.langRules
|
||||
langRules RU = RURules.langRules
|
||||
langRules SV = SVRules.langRules
|
||||
langRules SW = SWRules.langRules
|
||||
langRules TA = TARules.langRules
|
||||
langRules TR = TRRules.langRules
|
||||
langRules UK = UKRules.langRules
|
||||
|
46
Duckling/Rules/SW.hs
Normal file
46
Duckling/Rules/SW.hs
Normal file
@ -0,0 +1,46 @@
|
||||
-- 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 #-}
|
||||
|
||||
|
||||
module Duckling.Rules.SW
|
||||
( defaultRules
|
||||
, langRules
|
||||
, localeRules
|
||||
) where
|
||||
|
||||
import Duckling.Dimensions.Types
|
||||
import Duckling.Locale
|
||||
import Duckling.Types
|
||||
import qualified Duckling.Numeral.SW.Rules as Numeral
|
||||
|
||||
defaultRules :: Some Dimension -> [Rule]
|
||||
defaultRules = langRules
|
||||
|
||||
localeRules :: Region -> Some Dimension -> [Rule]
|
||||
localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
|
||||
localeRules _ _ = []
|
||||
|
||||
langRules :: Some Dimension -> [Rule]
|
||||
langRules (This AmountOfMoney) = []
|
||||
langRules (This CreditCardNumber) = []
|
||||
langRules (This Distance) = []
|
||||
langRules (This Duration) = []
|
||||
langRules (This Email) = []
|
||||
langRules (This Numeral) = Numeral.rules
|
||||
langRules (This Ordinal) = []
|
||||
langRules (This PhoneNumber) = []
|
||||
langRules (This Quantity) = []
|
||||
langRules (This RegexMatch) = []
|
||||
langRules (This Temperature) = []
|
||||
langRules (This Time) = []
|
||||
langRules (This TimeGrain) = []
|
||||
langRules (This Url) = []
|
||||
langRules (This Volume) = []
|
||||
langRules (This (CustomDimension dim)) = dimLangRules SW dim
|
@ -85,6 +85,7 @@ library
|
||||
, Duckling.Rules.RO
|
||||
, Duckling.Rules.RU
|
||||
, Duckling.Rules.SV
|
||||
, Duckling.Rules.SW
|
||||
, Duckling.Rules.TA
|
||||
, Duckling.Rules.TR
|
||||
, Duckling.Rules.UK
|
||||
@ -138,6 +139,7 @@ library
|
||||
, Duckling.Ranking.Classifiers.RO_XX
|
||||
, Duckling.Ranking.Classifiers.RU_XX
|
||||
, Duckling.Ranking.Classifiers.SV_XX
|
||||
, Duckling.Ranking.Classifiers.SW_XX
|
||||
, Duckling.Ranking.Classifiers.TA_XX
|
||||
, Duckling.Ranking.Classifiers.TR_XX
|
||||
, Duckling.Ranking.Classifiers.UK_XX
|
||||
@ -442,6 +444,8 @@ library
|
||||
, Duckling.Numeral.RU.Rules
|
||||
, Duckling.Numeral.SV.Corpus
|
||||
, Duckling.Numeral.SV.Rules
|
||||
, Duckling.Numeral.SW.Corpus
|
||||
, Duckling.Numeral.SW.Rules
|
||||
, Duckling.Numeral.TA.Corpus
|
||||
, Duckling.Numeral.TA.Rules
|
||||
, Duckling.Numeral.TR.Corpus
|
||||
@ -924,6 +928,7 @@ test-suite duckling-test
|
||||
, Duckling.Numeral.RO.Tests
|
||||
, Duckling.Numeral.RU.Tests
|
||||
, Duckling.Numeral.SV.Tests
|
||||
, Duckling.Numeral.SW.Tests
|
||||
, Duckling.Numeral.TA.Tests
|
||||
, Duckling.Numeral.TR.Tests
|
||||
, Duckling.Numeral.UK.Tests
|
||||
|
@ -206,6 +206,7 @@ getCorpusForLang PT = PTTime.corpus
|
||||
getCorpusForLang RO = ROTime.corpus
|
||||
getCorpusForLang RU = (testContext, testOptions, [])
|
||||
getCorpusForLang SV = SVTime.corpus
|
||||
getCorpusForLang SW = (testContext, testOptions, [])
|
||||
getCorpusForLang TA = (testContext, testOptions, [])
|
||||
getCorpusForLang TR = (testContext, testOptions, [])
|
||||
getCorpusForLang UK = UKTime.corpus
|
||||
|
22
tests/Duckling/Numeral/SW/Tests.hs
Normal file
22
tests/Duckling/Numeral/SW/Tests.hs
Normal file
@ -0,0 +1,22 @@
|
||||
-- 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.Numeral.SW.Tests
|
||||
( tests ) where
|
||||
|
||||
import Data.String
|
||||
import Prelude
|
||||
import Test.Tasty
|
||||
|
||||
import Duckling.Dimensions.Types
|
||||
import Duckling.Numeral.SW.Corpus
|
||||
import Duckling.Testing.Asserts
|
||||
|
||||
tests :: TestTree
|
||||
tests = testGroup "SW Tests"
|
||||
[ makeCorpusTest [This Numeral] corpus
|
||||
]
|
@ -48,6 +48,7 @@ import qualified Duckling.Numeral.PT.Tests as PT
|
||||
import qualified Duckling.Numeral.RO.Tests as RO
|
||||
import qualified Duckling.Numeral.RU.Tests as RU
|
||||
import qualified Duckling.Numeral.SV.Tests as SV
|
||||
import qualified Duckling.Numeral.SW.Tests as SW
|
||||
import qualified Duckling.Numeral.TA.Tests as TA
|
||||
import qualified Duckling.Numeral.TR.Tests as TR
|
||||
import qualified Duckling.Numeral.UK.Tests as UK
|
||||
@ -92,6 +93,7 @@ tests = testGroup "Numeral Tests"
|
||||
, RO.tests
|
||||
, RU.tests
|
||||
, SV.tests
|
||||
, SW.tests
|
||||
, TA.tests
|
||||
, TR.tests
|
||||
, UK.tests
|
||||
|
Loading…
Reference in New Issue
Block a user