mirror of
https://github.com/facebook/duckling.git
synced 2024-10-27 06:08:17 +03:00
bef7a44fa8
Summary: . Reviewed By: JonCoens Differential Revision: D6838082 fbshipit-source-id: 94757bdb80c6d3c29a7a6554429940a1b7403108
138 lines
3.4 KiB
Haskell
138 lines
3.4 KiB
Haskell
-- 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.Duration.DE.Rules
|
|
( rules ) where
|
|
|
|
import Control.Monad (join)
|
|
import qualified Data.Text as Text
|
|
import Prelude
|
|
import Data.String
|
|
|
|
import Duckling.Dimensions.Types
|
|
import Duckling.Duration.Helpers
|
|
import Duckling.Numeral.Helpers (parseInteger)
|
|
import Duckling.Numeral.Types (NumeralData (..))
|
|
import qualified Duckling.Numeral.Types as TNumeral
|
|
import Duckling.Regex.Types
|
|
import qualified Duckling.TimeGrain.Types as TG
|
|
import Duckling.Types
|
|
|
|
ruleHalfAnHour :: Rule
|
|
ruleHalfAnHour = Rule
|
|
{ name = "half an hour"
|
|
, pattern =
|
|
[ regex "(1/2\\s?|(einer )halbe?n? )stunde"
|
|
]
|
|
, prod = \_ -> Just . Token Duration $ duration TG.Minute 30
|
|
}
|
|
|
|
ruleFortnight :: Rule
|
|
ruleFortnight = Rule
|
|
{ name = "fortnight"
|
|
, pattern =
|
|
[ regex "(a|one)? fortnight"
|
|
]
|
|
, prod = \_ -> Just . Token Duration $ duration TG.Day 14
|
|
}
|
|
|
|
ruleIntegerMoreUnitofduration :: Rule
|
|
ruleIntegerMoreUnitofduration = Rule
|
|
{ name = "<integer> more <unit-of-duration>"
|
|
, pattern =
|
|
[ Predicate isNatural
|
|
, regex "mehr|weniger"
|
|
, dimension TimeGrain
|
|
]
|
|
, prod = \tokens -> case tokens of
|
|
(Token Numeral NumeralData{TNumeral.value = v}:
|
|
_:
|
|
Token TimeGrain grain:
|
|
_) -> Just . Token Duration . duration grain $ floor v
|
|
_ -> Nothing
|
|
}
|
|
|
|
ruleNumeralnumberHours :: Rule
|
|
ruleNumeralnumberHours = Rule
|
|
{ name = "number.number hours"
|
|
, pattern =
|
|
[ regex "(\\d+)\\.(\\d+) stunden?"
|
|
]
|
|
, prod = \tokens -> case tokens of
|
|
(Token RegexMatch (GroupMatch (h:m:_)):_) -> do
|
|
hh <- parseInteger h
|
|
mnum <- parseInteger m
|
|
let mden = 10 ^ Text.length m
|
|
Just . Token Duration $ minutesFromHourMixedFraction hh mnum mden
|
|
_ -> Nothing
|
|
}
|
|
|
|
ruleIntegerAndAnHalfHours :: Rule
|
|
ruleIntegerAndAnHalfHours = Rule
|
|
{ name = "<integer> and an half hours"
|
|
, pattern =
|
|
[ Predicate isNatural
|
|
, regex "ein ?halb stunden?"
|
|
]
|
|
, prod = \tokens -> case tokens of
|
|
(Token Numeral NumeralData{TNumeral.value = v}:_) ->
|
|
Just . Token Duration . duration TG.Minute $ 30 + 60 * floor v
|
|
_ -> Nothing
|
|
}
|
|
|
|
ruleAUnitofduration :: Rule
|
|
ruleAUnitofduration = Rule
|
|
{ name = "a <unit-of-duration>"
|
|
, pattern =
|
|
[ regex "eine?(r|n)?"
|
|
, dimension TimeGrain
|
|
]
|
|
, prod = \tokens -> case tokens of
|
|
(_:Token TimeGrain grain:_) -> Just . Token Duration $ duration grain 1
|
|
_ -> Nothing
|
|
}
|
|
|
|
ruleAboutDuration :: Rule
|
|
ruleAboutDuration = Rule
|
|
{ name = "about <duration>"
|
|
, pattern =
|
|
[ regex "ungefähr|zirka"
|
|
, dimension Duration
|
|
]
|
|
, prod = \tokens -> case tokens of
|
|
(_:token:_) -> Just token
|
|
_ -> Nothing
|
|
}
|
|
|
|
ruleExactlyDuration :: Rule
|
|
ruleExactlyDuration = Rule
|
|
{ name = "exactly <duration>"
|
|
, pattern =
|
|
[ regex "genau|exakt"
|
|
, dimension Duration
|
|
]
|
|
, prod = \tokens -> case tokens of
|
|
(_:token:_) -> Just token
|
|
_ -> Nothing
|
|
}
|
|
|
|
rules :: [Rule]
|
|
rules =
|
|
[ ruleAUnitofduration
|
|
, ruleAboutDuration
|
|
, ruleExactlyDuration
|
|
, ruleFortnight
|
|
, ruleHalfAnHour
|
|
, ruleIntegerAndAnHalfHours
|
|
, ruleIntegerMoreUnitofduration
|
|
, ruleNumeralnumberHours
|
|
]
|