Add ZH distance support

Summary: Add ZH distance support

Reviewed By: patapizza

Differential Revision: D7341977

fbshipit-source-id: 301d90515c492da9fa4c4faf5bcc3351eacbed1b
This commit is contained in:
Ziyang Liu 2018-03-21 12:06:48 -07:00 committed by Facebook Github Bot
parent 1a41d3f7f4
commit 22d11c055b
7 changed files with 234 additions and 3 deletions

View File

@ -14,7 +14,8 @@ import Duckling.Dimensions.Types
allDimensions :: [Some Dimension]
allDimensions =
[ This Duration
[ This Distance
, This Duration
, This Numeral
, This Ordinal
, This Temperature

View File

@ -0,0 +1,73 @@
-- 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.Distance.ZH.Corpus
( corpus ) where
import Data.String
import Prelude
import Duckling.Distance.Types
import Duckling.Locale
import Duckling.Resolve
import Duckling.Testing.Types
corpus :: Corpus
corpus = (testContext {locale = makeLocale ZH Nothing}, testOptions, allExamples)
allExamples :: [Example]
allExamples = concat
[ examples (simple Centimetre 2)
[ "2cm"
, "2 厘米"
, "二厘米"
, "2公分"
, "二公分"
]
, examples (simple Metre 9)
[ "9m"
, "9 m"
, "九米"
, "9公尺"
]
, examples (simple Kilometre 3)
[ "3千米"
, "3公里"
, "三公裏"
, "3 km"
, "3km"
]
, examples (simple Kilometre 3.0)
[ "3.0 公里"
]
, examples (simple Foot 8)
[ "8 foot"
, "8 feet"
, "8 foots"
, "8 feets"
, "8'"
, "8英尺"
, "8呎"
]
, examples (simple Inch 4)
[ "4 inch"
, "4 inches"
, "4''"
, "4英寸"
, "4英吋"
, "四吋"
]
, examples (simple Mile 1)
[ "1 mile"
, "1 miles"
, "1英里"
, "一英裏"
]
]

View File

@ -0,0 +1,129 @@
-- 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 LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Duckling.Distance.ZH.Rules
( rules ) where
import Data.String
import Prelude
import Duckling.Dimensions.Types
import Duckling.Distance.Helpers
import Duckling.Numeral.Types (NumeralData (..))
import Duckling.Types
import qualified Duckling.Distance.Types as TDistance
import qualified Duckling.Numeral.Types as TNumeral
ruleDistCentimeters :: Rule
ruleDistCentimeters = Rule
{ name = "<dist> centimeters"
, pattern =
[ dimension Distance
, regex "cm|厘米|公分"
]
, prod = \case
(Token Distance dd:_) ->
Just . Token Distance $ withUnit TDistance.Centimetre dd
_ -> Nothing
}
ruleDistMeters :: Rule
ruleDistMeters = Rule
{ name = "<dist> meters"
, pattern =
[ dimension Distance
, regex "m|米|公尺"
]
, prod = \case
(Token Distance dd:_) ->
Just . Token Distance $ withUnit TDistance.Metre dd
_ -> Nothing
}
ruleDistKm :: Rule
ruleDistKm = Rule
{ name = "<dist> km"
, pattern =
[ dimension Distance
, regex "km|千米|公(里|裏)"
]
, prod = \case
(Token Distance dd:_) ->
Just . Token Distance $ withUnit TDistance.Kilometre dd
_ -> Nothing
}
ruleDistFeetAndDistInch :: Rule
ruleDistFeetAndDistInch = Rule
{ name = "<dist> feet and <dist> inch "
, pattern =
[ dimension Distance
, regex "'|f(oo|ee)?ts?|英尺|呎"
, dimension Distance
, regex "''|inch(es)?|英寸|英吋|吋"
]
, prod = \case
(Token Distance dd:_) ->
Just . Token Distance $ withUnit TDistance.Foot dd
_ -> Nothing
}
ruleDistInch :: Rule
ruleDistInch = Rule
{ name = "<dist> inch"
, pattern =
[ dimension Distance
, regex "''|inch(es)?|英寸|英吋|吋"
]
, prod = \case
(Token Distance dd:_) ->
Just . Token Distance $ withUnit TDistance.Inch dd
_ -> Nothing
}
ruleDistFeet :: Rule
ruleDistFeet = Rule
{ name = "<dist> feet"
, pattern =
[ dimension Distance
, regex "'|f(oo|ee)?ts?|英尺|呎"
]
, prod = \case
(Token Distance dd:_) ->
Just . Token Distance $ withUnit TDistance.Foot dd
_ -> Nothing
}
ruleDistMiles :: Rule
ruleDistMiles = Rule
{ name = "<dist> miles"
, pattern =
[ dimension Distance
, regex "miles?|英(里|裏)"
]
, prod = \case
(Token Distance dd:_) ->
Just . Token Distance $ withUnit TDistance.Mile dd
_ -> Nothing
}
rules :: [Rule]
rules =
[ ruleDistCentimeters
, ruleDistFeet
, ruleDistFeetAndDistInch
, ruleDistInch
, ruleDistKm
, ruleDistMeters
, ruleDistMiles
]

View File

@ -18,6 +18,7 @@ module Duckling.Rules.ZH
import Duckling.Dimensions.Types
import Duckling.Locale
import Duckling.Types
import qualified Duckling.Distance.ZH.Rules as Distance
import qualified Duckling.Numeral.ZH.Rules as Numeral
import qualified Duckling.Ordinal.ZH.Rules as Ordinal
import qualified Duckling.Temperature.ZH.Rules as Temperature
@ -40,7 +41,7 @@ localeRules _ _ = []
langRules :: Some Dimension -> [Rule]
langRules (This AmountOfMoney) = []
langRules (This Distance) = []
langRules (This Distance) = Distance.rules
langRules (This Duration) = []
langRules (This Email) = []
langRules (This Numeral) = Numeral.rules

View File

@ -227,6 +227,8 @@ library
, Duckling.Distance.TR.Rules
, Duckling.Distance.SV.Corpus
, Duckling.Distance.SV.Rules
, Duckling.Distance.ZH.Corpus
, Duckling.Distance.ZH.Rules
, Duckling.Distance.Helpers
, Duckling.Distance.Rules
, Duckling.Distance.Types
@ -702,6 +704,7 @@ test-suite duckling-test
, Duckling.Distance.RU.Tests
, Duckling.Distance.TR.Tests
, Duckling.Distance.SV.Tests
, Duckling.Distance.ZH.Tests
, Duckling.Distance.Tests
-- Duration

View File

@ -17,7 +17,6 @@ import Test.Tasty
import qualified Duckling.Distance.BG.Tests as BG
import qualified Duckling.Distance.CS.Tests as CS
import qualified Duckling.Distance.EN.Tests as EN
import qualified Duckling.Distance.BG.Tests as BG
import qualified Duckling.Distance.ES.Tests as ES
import qualified Duckling.Distance.FR.Tests as FR
import qualified Duckling.Distance.GA.Tests as GA
@ -29,6 +28,7 @@ import qualified Duckling.Distance.RO.Tests as RO
import qualified Duckling.Distance.RU.Tests as RU
import qualified Duckling.Distance.TR.Tests as TR
import qualified Duckling.Distance.SV.Tests as SV
import qualified Duckling.Distance.ZH.Tests as ZH
tests :: TestTree
tests = testGroup "Distance Tests"
@ -46,4 +46,5 @@ tests = testGroup "Distance Tests"
, RU.tests
, TR.tests
, SV.tests
, ZH.tests
]

View File

@ -0,0 +1,23 @@
-- 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.Distance.ZH.Tests
( tests ) where
import Data.String
import Prelude
import Test.Tasty
import Duckling.Dimensions.Types
import Duckling.Distance.ZH.Corpus
import Duckling.Testing.Asserts
tests :: TestTree
tests = testGroup "ZH Tests"
[ makeCorpusTest [This Distance] corpus
]