Skip to content

Commit b69874c

Browse files
serefayarfacebook-github-bot
authored andcommitted
Duration for TR
Summary: Closes facebook#32 Reviewed By: niteria Differential Revision: D5150778 Pulled By: patapizza fbshipit-source-id: d156b0a
1 parent 292a941 commit b69874c

File tree

8 files changed

+259
-2
lines changed

8 files changed

+259
-2
lines changed

Duckling/Dimensions/TR.hs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Duckling.Dimensions.Types
1515
allDimensions :: [Some Dimension]
1616
allDimensions =
1717
[ This Distance
18+
, This Duration
1819
, This Numeral
1920
, This Ordinal
2021
, This Temperature

Duckling/Duration/TR/Corpus.hs

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
-- Copyright (c) 2016-present, Facebook, Inc.
2+
-- All rights reserved.
3+
--
4+
-- This source code is licensed under the BSD-style license found in the
5+
-- LICENSE file in the root directory of this source tree. An additional grant
6+
-- of patent rights can be found in the PATENTS file in the same directory.
7+
8+
9+
{-# LANGUAGE OverloadedStrings #-}
10+
11+
module Duckling.Duration.TR.Corpus
12+
( corpus
13+
) where
14+
15+
import Data.String
16+
import Prelude
17+
18+
import Duckling.Duration.Types
19+
import Duckling.Lang
20+
import Duckling.Resolve
21+
import Duckling.Testing.Types
22+
import Duckling.TimeGrain.Types (Grain (..))
23+
24+
corpus :: Corpus
25+
corpus = (testContext {lang = TR}, allExamples)
26+
27+
allExamples :: [Example]
28+
allExamples = concat
29+
[ examples (DurationData 1 Second)
30+
[ "bir sn"
31+
, "1 saniye"
32+
, "1\""
33+
]
34+
, examples (DurationData 2 Minute)
35+
[ "2 dk"
36+
, "iki dakika"
37+
, "2'"
38+
]
39+
, examples (DurationData 30 Day)
40+
[ "30 gün"
41+
]
42+
, examples (DurationData 7 Week)
43+
[ "yedi hafta"
44+
]
45+
, examples (DurationData 1 Month)
46+
[ "1 ay"
47+
, "bir ay"
48+
]
49+
, examples (DurationData 3 Quarter)
50+
[ "3 çeyrek yıl"
51+
]
52+
, examples (DurationData 2 Year)
53+
[ "2 yıl"
54+
]
55+
]

Duckling/Duration/TR/Rules.hs

+128
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
-- Copyright (c) 2016-present, Facebook, Inc.
2+
-- All rights reserved.
3+
--
4+
-- This source code is licensed under the BSD-style license found in the
5+
-- LICENSE file in the root directory of this source tree. An additional grant
6+
-- of patent rights can be found in the PATENTS file in the same directory.
7+
8+
9+
{-# LANGUAGE GADTs #-}
10+
{-# LANGUAGE OverloadedStrings #-}
11+
12+
module Duckling.Duration.TR.Rules
13+
( rules
14+
) where
15+
16+
import Control.Monad (join)
17+
import Data.String
18+
import Prelude
19+
import qualified Data.Text as Text
20+
21+
import Duckling.Dimensions.Types
22+
import Duckling.Duration.Helpers
23+
import Duckling.Numeral.Helpers (parseInt)
24+
import Duckling.Numeral.Types (NumeralData (..))
25+
import Duckling.Regex.Types
26+
import Duckling.Types
27+
import qualified Duckling.Numeral.Types as TNumeral
28+
import qualified Duckling.TimeGrain.Types as TG
29+
30+
ruleDurationQuarterOfAnHour :: Rule
31+
ruleDurationQuarterOfAnHour = Rule
32+
{ name = "quarter of an hour"
33+
, pattern = [ regex "(1/4\\s?sa(at)?|\x00e7eyrek saat)" ]
34+
, prod = \_ -> Just . Token Duration $ duration TG.Minute 15
35+
}
36+
37+
ruleDurationHalfAnHour :: Rule
38+
ruleDurationHalfAnHour = Rule
39+
{ name = "half an hour"
40+
, pattern = [regex "(1/2\\s?sa(at)?|yar\305m saat)"]
41+
, prod = \_ -> Just . Token Duration $ duration TG.Minute 30
42+
}
43+
44+
ruleDurationThreeQuartersOfAnHour :: Rule
45+
ruleDurationThreeQuartersOfAnHour = Rule
46+
{ name = "three-quarters of an hour"
47+
, pattern = [regex "(3/4\\s?sa(at)?|\x00fc\x00e7e \231eyrek sa(at)?)"]
48+
, prod = \_ -> Just . Token Duration $ duration TG.Minute 45
49+
}
50+
51+
ruleDurationFortnight :: Rule
52+
ruleDurationFortnight = Rule
53+
{ name = "fortnight"
54+
, pattern = [regex "iki hafta"]
55+
, prod = \_ -> Just . Token Duration $ duration TG.Day 14
56+
}
57+
58+
ruleNumeralQuotes :: Rule
59+
ruleNumeralQuotes = Rule
60+
{ name = "<integer> + '\""
61+
, pattern =
62+
[ Predicate isNatural
63+
, regex "(['\"])"
64+
]
65+
, prod = \tokens -> case tokens of
66+
(Token Numeral (NumeralData {TNumeral.value = v}):
67+
Token RegexMatch (GroupMatch (x:_)):
68+
_) -> case x of
69+
"'" -> Just . Token Duration . duration TG.Minute $ floor v
70+
"\"" -> Just . Token Duration . duration TG.Second $ floor v
71+
_ -> Nothing
72+
_ -> Nothing
73+
}
74+
75+
76+
ruleDurationDotNumeralHours :: Rule
77+
ruleDurationDotNumeralHours = Rule
78+
{ name = "number.number hours"
79+
, pattern = [regex "(\\d+)(\\.|,)(\\d+) *sa(at)?"]
80+
, prod = \tokens -> case tokens of
81+
(Token RegexMatch (GroupMatch (h:d:_)):_) -> do
82+
hh <- parseInt h
83+
dec <- parseInt d
84+
let divisor = floor $ (fromIntegral (10 :: Integer) :: Float) **
85+
fromIntegral (Text.length d - 1)
86+
numerator = fromIntegral $ 6 * dec
87+
Just . Token Duration . duration TG.Minute $
88+
60 * hh + quot numerator divisor
89+
_ -> Nothing
90+
}
91+
92+
ruleDurationAndHalfHour :: Rule
93+
ruleDurationAndHalfHour = Rule
94+
{ name = "<integer> and an half hour"
95+
, pattern =
96+
[ Predicate isNatural
97+
, regex "bu\x00e7euk sa(at)?"
98+
]
99+
, prod = \tokens -> case tokens of
100+
(Token Numeral (NumeralData {TNumeral.value = v}):_) ->
101+
Just . Token Duration . duration TG.Minute $ 30 + 60 * floor v
102+
_ -> Nothing
103+
}
104+
105+
106+
ruleDurationPrecision :: Rule
107+
ruleDurationPrecision = Rule
108+
{ name = "<duration> about|exactly"
109+
, pattern =
110+
[ regex "(gibi|civar\305nda|yakla\x015f\305k|tam( olarak)?)"
111+
, dimension Duration
112+
]
113+
, prod = \tokens -> case tokens of
114+
(_:token:_) -> Just token
115+
_ -> Nothing
116+
}
117+
118+
rules :: [Rule]
119+
rules =
120+
[ ruleDurationQuarterOfAnHour
121+
, ruleDurationHalfAnHour
122+
, ruleDurationThreeQuartersOfAnHour
123+
, ruleDurationFortnight
124+
, ruleDurationDotNumeralHours
125+
, ruleDurationAndHalfHour
126+
, ruleDurationPrecision
127+
, ruleNumeralQuotes
128+
]

Duckling/Rules/TR.hs

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ module Duckling.Rules.TR
1616
import Duckling.Dimensions.Types
1717
import Duckling.Types
1818
import qualified Duckling.Distance.TR.Rules as Distance
19+
import qualified Duckling.Duration.TR.Rules as Duration
1920
import qualified Duckling.Numeral.TR.Rules as Numeral
2021
import qualified Duckling.Ordinal.TR.Rules as Ordinal
2122
import qualified Duckling.Temperature.TR.Rules as Temperature
23+
import qualified Duckling.TimeGrain.TR.Rules as TimeGrain
2224

2325
rules :: Some Dimension -> [Rule]
2426
rules (This Distance) = Distance.rules
25-
rules (This Duration) = []
27+
rules (This Duration) = Duration.rules
2628
rules (This Numeral) = Numeral.rules
2729
rules (This Email) = []
2830
rules (This AmountOfMoney) = []
@@ -32,6 +34,6 @@ rules (This Quantity) = []
3234
rules (This RegexMatch) = []
3335
rules (This Temperature) = Temperature.rules
3436
rules (This Time) = []
35-
rules (This TimeGrain) = []
37+
rules (This TimeGrain) = TimeGrain.rules
3638
rules (This Url) = []
3739
rules (This Volume) = []

Duckling/TimeGrain/TR/Rules.hs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
-- Copyright (c) 2016-present, Facebook, Inc.
2+
-- All rights reserved.
3+
--
4+
-- This source code is licensed under the BSD-style license found in the
5+
-- LICENSE file in the root directory of this source tree. An additional grant
6+
-- of patent rights can be found in the PATENTS file in the same directory.
7+
8+
9+
{-# LANGUAGE OverloadedStrings #-}
10+
11+
module Duckling.TimeGrain.TR.Rules
12+
( rules
13+
) where
14+
15+
import Data.String
16+
import Data.Text (Text)
17+
import Prelude
18+
19+
import Duckling.Dimensions.Types
20+
import Duckling.Types
21+
import qualified Duckling.TimeGrain.Types as TG
22+
23+
grains :: [(Text, String, TG.Grain)]
24+
grains = [ ("saniye (grain)", "sa?n(iye)?", TG.Second)
25+
, ("dakika (grain)", "da?k(ika)?", TG.Minute)
26+
, ("saat (grain)", "sa(at)?", TG.Hour)
27+
, ("gün (grain)", "g\x00fcn", TG.Day)
28+
, ("hafta (grain)", "hafta", TG.Week)
29+
, ("ay (grain)", "ay", TG.Month)
30+
, ("çeyrek yıl (grain)", "\231eyrek y\305l", TG.Quarter)
31+
, ("yıl (grain)", "y\305l", TG.Year)
32+
]
33+
34+
rules :: [Rule]
35+
rules = map go grains
36+
where
37+
go (name, regexPattern, grain) = Rule
38+
{ name = name
39+
, pattern = [regex regexPattern]
40+
, prod = \_ -> Just $ Token TimeGrain grain
41+
}

duckling.cabal

+4
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ library
215215
, Duckling.Duration.ZH.Corpus
216216
, Duckling.Duration.RO.Corpus
217217
, Duckling.Duration.RO.Rules
218+
, Duckling.Duration.TR.Corpus
219+
, Duckling.Duration.TR.Rules
218220
, Duckling.Duration.Helpers
219221
, Duckling.Duration.Rules
220222
, Duckling.Duration.Types
@@ -454,6 +456,7 @@ library
454456
, Duckling.TimeGrain.PT.Rules
455457
, Duckling.TimeGrain.RO.Rules
456458
, Duckling.TimeGrain.SV.Rules
459+
, Duckling.TimeGrain.TR.Rules
457460
, Duckling.TimeGrain.VI.Rules
458461
, Duckling.TimeGrain.ZH.Rules
459462
, Duckling.TimeGrain.Types
@@ -570,6 +573,7 @@ test-suite duckling-test
570573
, Duckling.Duration.PT.Tests
571574
, Duckling.Duration.RO.Tests
572575
, Duckling.Duration.SV.Tests
576+
, Duckling.Duration.TR.Tests
573577
, Duckling.Duration.ZH.Tests
574578
, Duckling.Duration.Tests
575579

tests/Duckling/Duration/TR/Tests.hs

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
-- Copyright (c) 2016-present, Facebook, Inc.
2+
-- All rights reserved.
3+
--
4+
-- This source code is licensed under the BSD-style license found in the
5+
-- LICENSE file in the root directory of this source tree. An additional grant
6+
-- of patent rights can be found in the PATENTS file in the same directory.
7+
8+
9+
module Duckling.Duration.TR.Tests
10+
( tests
11+
) where
12+
13+
import Prelude
14+
import Data.String
15+
import Test.Tasty
16+
17+
import Duckling.Dimensions.Types
18+
import Duckling.Duration.TR.Corpus
19+
import Duckling.Testing.Asserts
20+
21+
tests :: TestTree
22+
tests = testGroup "TR Tests"
23+
[ makeCorpusTest [This Duration] corpus
24+
]

tests/Duckling/Duration/Tests.hs

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import qualified Duckling.Duration.PL.Tests as PL
2424
import qualified Duckling.Duration.PT.Tests as PT
2525
import qualified Duckling.Duration.RO.Tests as RO
2626
import qualified Duckling.Duration.SV.Tests as SV
27+
import qualified Duckling.Duration.TR.Tests as TR
2728
import qualified Duckling.Duration.ZH.Tests as ZH
2829

2930
tests :: TestTree
@@ -38,5 +39,6 @@ tests = testGroup "Duration Tests"
3839
, PT.tests
3940
, RO.tests
4041
, SV.tests
42+
, TR.tests
4143
, ZH.tests
4244
]

0 commit comments

Comments
 (0)