diff --git a/Duckling/AmountOfMoney/AR/Corpus.hs b/Duckling/AmountOfMoney/AR/Corpus.hs
--- a/Duckling/AmountOfMoney/AR/Corpus.hs
+++ b/Duckling/AmountOfMoney/AR/Corpus.hs
@@ -21,7 +21,8 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing},
+  testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/AR/Rules.hs b/Duckling/AmountOfMoney/AR/Rules.hs
--- a/Duckling/AmountOfMoney/AR/Rules.hs
+++ b/Duckling/AmountOfMoney/AR/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.AR.Rules
@@ -28,6 +29,20 @@
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 rulePounds :: Rule
 rulePounds = Rule
   { name = "£"
@@ -373,7 +388,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleCent
+  [ ruleUnitAmount
+  , ruleCent
   , rulePounds
   , ruleDinars
   , ruleDirhams
diff --git a/Duckling/AmountOfMoney/BG/Corpus.hs b/Duckling/AmountOfMoney/BG/Corpus.hs
--- a/Duckling/AmountOfMoney/BG/Corpus.hs
+++ b/Duckling/AmountOfMoney/BG/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale BG Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale BG Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/BG/Rules.hs b/Duckling/AmountOfMoney/BG/Rules.hs
--- a/Duckling/AmountOfMoney/BG/Rules.hs
+++ b/Duckling/AmountOfMoney/BG/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.BG.Rules
@@ -16,18 +17,30 @@
 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.Helpers (isNatural, isPositive)
 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
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleBGN :: Rule
 ruleBGN = Rule
   { name = "лв"
@@ -255,7 +268,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleBGN
+  [ ruleUnitAmount
+  , ruleBGN
   , ruleDollar
   , ruleCent
   , ruleEUR
diff --git a/Duckling/AmountOfMoney/EN/Corpus.hs b/Duckling/AmountOfMoney/EN/Corpus.hs
--- a/Duckling/AmountOfMoney/EN/Corpus.hs
+++ b/Duckling/AmountOfMoney/EN/Corpus.hs
@@ -20,14 +20,14 @@
 import Duckling.Testing.Types
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "exactly dollars"
       ]
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/EN/Rules.hs b/Duckling/AmountOfMoney/EN/Rules.hs
--- a/Duckling/AmountOfMoney/EN/Rules.hs
+++ b/Duckling/AmountOfMoney/EN/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.EN.Rules
@@ -28,6 +29,20 @@
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 rulePounds :: Rule
 rulePounds = Rule
   { name = "£"
@@ -310,7 +325,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleACurrency
+  [ ruleUnitAmount
+  , ruleACurrency
   , ruleBucks
   , ruleCent
   , ruleDinars
diff --git a/Duckling/AmountOfMoney/ES/Corpus.hs b/Duckling/AmountOfMoney/ES/Corpus.hs
--- a/Duckling/AmountOfMoney/ES/Corpus.hs
+++ b/Duckling/AmountOfMoney/ES/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/ES/Rules.hs b/Duckling/AmountOfMoney/ES/Rules.hs
--- a/Duckling/AmountOfMoney/ES/Rules.hs
+++ b/Duckling/AmountOfMoney/ES/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.ES.Rules
@@ -20,12 +21,26 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleDollar :: Rule
 ruleDollar = Rule
   { name = "dollar"
@@ -115,7 +130,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleCent
+  [ ruleUnitAmount
+  , ruleCent
   , ruleDollar
   , ruleIntersect
   , ruleIntersectAndNumeral
diff --git a/Duckling/AmountOfMoney/FR/Corpus.hs b/Duckling/AmountOfMoney/FR/Corpus.hs
--- a/Duckling/AmountOfMoney/FR/Corpus.hs
+++ b/Duckling/AmountOfMoney/FR/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/FR/Rules.hs b/Duckling/AmountOfMoney/FR/Rules.hs
--- a/Duckling/AmountOfMoney/FR/Rules.hs
+++ b/Duckling/AmountOfMoney/FR/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.FR.Rules
@@ -26,6 +27,20 @@
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleIntersectAndNumeral :: Rule
 ruleIntersectAndNumeral = Rule
   { name = "intersect (and number)"
@@ -242,7 +257,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleCent
+  [ ruleUnitAmount
+  , ruleCent
   , ruleIntersect
   , ruleIntersectAndNumeral
   , ruleIntersectAndXCents
diff --git a/Duckling/AmountOfMoney/GA/Corpus.hs b/Duckling/AmountOfMoney/GA/Corpus.hs
--- a/Duckling/AmountOfMoney/GA/Corpus.hs
+++ b/Duckling/AmountOfMoney/GA/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/GA/Rules.hs b/Duckling/AmountOfMoney/GA/Rules.hs
--- a/Duckling/AmountOfMoney/GA/Rules.hs
+++ b/Duckling/AmountOfMoney/GA/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.GA.Rules
@@ -20,12 +21,26 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency (..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleDollar :: Rule
 ruleDollar = Rule
   { name = "$"
@@ -148,7 +163,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleAmountofmoneyGlan
+  [ ruleUnitAmount
+  , ruleAmountofmoneyGlan
   , ruleCent
   , ruleDollar
   , ruleInr
diff --git a/Duckling/AmountOfMoney/HR/Corpus.hs b/Duckling/AmountOfMoney/HR/Corpus.hs
--- a/Duckling/AmountOfMoney/HR/Corpus.hs
+++ b/Duckling/AmountOfMoney/HR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/HR/Rules.hs b/Duckling/AmountOfMoney/HR/Rules.hs
--- a/Duckling/AmountOfMoney/HR/Rules.hs
+++ b/Duckling/AmountOfMoney/HR/Rules.hs
@@ -6,6 +6,7 @@
 -- of patent rights can be found in the PATENTS file in the same directory.
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.HR.Rules
@@ -21,13 +22,27 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 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
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleIntersectAndNumber :: Rule
 ruleIntersectAndNumber = Rule
   { name = "intersect (and number)"
@@ -185,7 +200,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleDollar
+  [ ruleUnitAmount
+  , ruleDollar
   , rulePound
   , ruleOtherPounds
   , ruleAed
diff --git a/Duckling/AmountOfMoney/Helpers.hs b/Duckling/AmountOfMoney/Helpers.hs
--- a/Duckling/AmountOfMoney/Helpers.hs
+++ b/Duckling/AmountOfMoney/Helpers.hs
@@ -12,7 +12,11 @@
 module Duckling.AmountOfMoney.Helpers
   ( currencyOnly
   , financeWith
+  , isSimpleAmountOfMoney
+  , isCent
   , isCents
+  , isCurrencyOnly
+  , isDime
   , isMoneyWithValue
   , isWithoutCents
   , withCents
@@ -27,7 +31,7 @@
 import Prelude
 
 import Duckling.AmountOfMoney.Types (Currency (..), AmountOfMoneyData (..))
-import Duckling.Numeral.Types (isInteger)
+import Duckling.Numeral.Types (getIntValue, isInteger)
 import Duckling.Dimensions.Types
 import Duckling.Types hiding (Entity(..))
 
@@ -53,6 +57,28 @@
 isMoneyWithValue (Token AmountOfMoney AmountOfMoneyData{value = v1, minValue = v2, maxValue = v3}) =
  any isJust [v1, v2, v3]
 isMoneyWithValue _ = False
+
+isCurrencyOnly :: Predicate
+isCurrencyOnly (Token AmountOfMoney AmountOfMoneyData
+  {value = Nothing, minValue = Nothing, maxValue = Nothing}) = True
+isCurrencyOnly _ = False
+
+isSimpleAmountOfMoney :: Predicate
+isSimpleAmountOfMoney (Token AmountOfMoney AmountOfMoneyData
+  {minValue = Nothing, maxValue = Nothing}) = True
+isSimpleAmountOfMoney _ = False
+
+isDime :: Predicate
+isDime (Token AmountOfMoney AmountOfMoneyData
+  {value = Just d, currency = Cent}) =
+  maybe False (\i -> (i `mod` 10) == 0) $ getIntValue d
+isDime _ = False
+
+isCent :: Predicate
+isCent (Token AmountOfMoney AmountOfMoneyData
+  {value = Just c, currency = Cent}) =
+  maybe False (\i -> i >= 0 && i <= 9) $ getIntValue c
+isCent _ = False
 
 -- -----------------------------------------------------------------
 -- Production
diff --git a/Duckling/AmountOfMoney/ID/Corpus.hs b/Duckling/AmountOfMoney/ID/Corpus.hs
--- a/Duckling/AmountOfMoney/ID/Corpus.hs
+++ b/Duckling/AmountOfMoney/ID/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ID Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ID Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/ID/Rules.hs b/Duckling/AmountOfMoney/ID/Rules.hs
--- a/Duckling/AmountOfMoney/ID/Rules.hs
+++ b/Duckling/AmountOfMoney/ID/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.ID.Rules
@@ -18,14 +19,28 @@
 import Prelude
 
 import Duckling.AmountOfMoney.Helpers
-import Duckling.AmountOfMoney.Types (Currency(..))
+import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData(..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleDollar :: Rule
 ruleDollar = Rule
   { name = "$"
@@ -78,7 +93,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleDollar
+  [ ruleUnitAmount
+  , ruleDollar
   , ruleIdr
   , ruleIntersect
   , ruleJpy
diff --git a/Duckling/AmountOfMoney/KO/Corpus.hs b/Duckling/AmountOfMoney/KO/Corpus.hs
--- a/Duckling/AmountOfMoney/KO/Corpus.hs
+++ b/Duckling/AmountOfMoney/KO/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/KO/Rules.hs b/Duckling/AmountOfMoney/KO/Rules.hs
--- a/Duckling/AmountOfMoney/KO/Rules.hs
+++ b/Duckling/AmountOfMoney/KO/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.KO.Rules
@@ -20,9 +21,26 @@
 import Duckling.Dimensions.Types
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
+import Duckling.Numeral.Helpers (isPositive)
+import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
+import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleAmountofmoneyAbout :: Rule
 ruleAmountofmoneyAbout = Rule
   { name = "<amount-of-money> about"
@@ -147,7 +165,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleAboutAmountofmoney
+  [ ruleUnitAmount
+  , ruleAboutAmountofmoney
   , ruleAmountofmoneyAbout
   , ruleAud
   , ruleCent
diff --git a/Duckling/AmountOfMoney/NB/Corpus.hs b/Duckling/AmountOfMoney/NB/Corpus.hs
--- a/Duckling/AmountOfMoney/NB/Corpus.hs
+++ b/Duckling/AmountOfMoney/NB/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/NB/Rules.hs b/Duckling/AmountOfMoney/NB/Rules.hs
--- a/Duckling/AmountOfMoney/NB/Rules.hs
+++ b/Duckling/AmountOfMoney/NB/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.NB.Rules
@@ -20,12 +21,26 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency (..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleIntersectAndNumeral :: Rule
 ruleIntersectAndNumeral = Rule
   { name = "intersect (and number)"
@@ -152,7 +167,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleAboutAmountofmoney
+  [ ruleUnitAmount
+  , ruleAboutAmountofmoney
   , ruleCent
   , ruleDirham
   , ruleIntersect
diff --git a/Duckling/AmountOfMoney/NL/Corpus.hs b/Duckling/AmountOfMoney/NL/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/NL/Corpus.hs
@@ -0,0 +1,106 @@
+-- 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.NL.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 NL Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Dollar 1)
+             [ "$1"
+             , "1 dollar"
+             ]
+  , examples (simple Dollar 10)
+             [ "$10"
+             , "$ 10"
+             , "10$"
+             , "10 dollars"
+             , "tien dollar"
+             ]
+  , examples (simple Cent 10)
+             [ "10 cent"
+             , "tien pennies"
+             , "tien cents"
+             , "10 c"
+             , "10¢"
+             ]
+  , examples (simple Dollar 10000)
+             [ "$10K"
+             , "10k$"
+             , "$10000"
+             , "10000,00 $"
+             ]
+  , examples (simple USD 3.14)
+             [ "USD3,14"
+             , "3,14US$"
+             , "US$ 3,14"
+             ]
+  , examples (simple EUR 20)
+             [ "20\x20ac"
+             , "20 euros"
+             , "20 Euro"
+             , "20 Euros"
+             , "EUR 20"
+             , "EUR 20,0"
+             , "20€"
+             , "20 €ur"
+             ]
+  , examples (simple Dollar 20.43)
+             [ "$20 en 43c"
+             , "$20,43"
+             , "20 dollar 43c"
+             , "20 dollars 43 cents"
+             , "20 dollar 43"
+             ]
+  , examples (simple GBP 3.01)
+             [ "GBP3,01"
+             , "GBP 3,01"
+             , "3 GBP een penny"
+             ]
+  , examples (simple Unnamed 42)
+             [ "42 bucks"
+             , "ongeveer twee-en-veertig bucks"
+             , "precies 42 bucks"
+             ]
+  , examples (between Dollar (10, 20))
+             [ "vanaf 10 dollars tot 20 dollars"
+             , "rond de 10-20 dollars"
+             , "tussen 10 dollars en 20 dollars"
+             , "ongeveer $10-$20"
+             , "10-20 dollars"
+             ]
+  , examples (between Dollar (1.1, 1.3))
+             [ "tussen 1,1 dollar en 1,3 dollars"
+             , "van 1,1$ en 1,3 dollars"
+             ]
+  , examples (under EUR 7)
+             [ "minder dan 7 euros"
+             , "minder dan zeven EUR"
+             , "lager dan 7€"
+             ]
+  , examples (above Dollar 1.42)
+             [ "meer dan 1 dollar en 42 cents"
+             , "minstens $1,42"
+             , "boven de 1,42 dollars"
+             , "boven de 1 dollar en 42 cents"
+             ]
+  ]
diff --git a/Duckling/AmountOfMoney/NL/Rules.hs b/Duckling/AmountOfMoney/NL/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/NL/Rules.hs
@@ -0,0 +1,270 @@
+-- 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.AmountOfMoney.NL.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.Helpers (isNatural, isPositive)
+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
+
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
+rulePounds :: Rule
+rulePounds = Rule
+  { name = "£"
+  , pattern =
+    [ regex "pou?nds?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Pound
+  }
+
+ruleCent :: Rule
+ruleCent = Rule
+  { name = "cent"
+  , pattern =
+    [ regex "cents?|penn(y|ies)|pence|sens?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+  }
+
+ruleBucks :: Rule
+ruleBucks = Rule
+  { name = "bucks"
+  , pattern =
+    [ regex "bucks?"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Unnamed
+  }
+
+ruleIntersectAndXCents :: Rule
+ruleIntersectAndXCents = Rule
+  { name = "intersect (and X cents)"
+  , pattern =
+    [ Predicate isWithoutCents
+    , regex "en"
+    , Predicate isCents
+    ]
+  , 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 =
+    [ Predicate isWithoutCents
+    , Predicate isNatural
+    ]
+  , 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 =
+    [ Predicate isWithoutCents
+    , regex "en"
+    , Predicate isNatural
+    ]
+  , 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 =
+    [ Predicate isWithoutCents
+    , Predicate isCents
+    ]
+  , 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 "precies|ongeveer|over|dicht|bijna|in de buurt|rond de"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \tokens -> case tokens of
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntervalBetweenNumeral :: Rule
+ruleIntervalBetweenNumeral = Rule
+  { name = "between|from <numeral> to|and <amount-of-money>"
+  , pattern =
+    [ regex "tussen|vanaf|van"
+    , Predicate isPositive
+    , regex "tot|en"
+    , 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}:
+       _) | from < to ->
+        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 "tussen|vanaf|van"
+    , financeWith TAmountOfMoney.value isJust
+    , regex "tot|en"
+    , 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}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isNatural
+    , 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}:
+       _) | from < to ->
+         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}:
+       _) | from < to && 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 "(minder|lager|niet? meer) dan"
+    , 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 = "over/above/at least/more than <amount-of-money>"
+  , pattern =
+    [ regex "boven de|minstens|meer dan"
+    , 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
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleUnitAmount
+  , ruleBucks
+  , ruleCent
+  , ruleIntersect
+  , ruleIntersectAndNumeral
+  , ruleIntersectAndXCents
+  , ruleIntersectXCents
+  , ruleIntervalBetweenNumeral
+  , ruleIntervalBetween
+  , ruleIntervalMax
+  , ruleIntervalMin
+  , ruleIntervalNumeralDash
+  , ruleIntervalDash
+  , rulePounds
+  , rulePrecision
+  ]
diff --git a/Duckling/AmountOfMoney/PT/Corpus.hs b/Duckling/AmountOfMoney/PT/Corpus.hs
--- a/Duckling/AmountOfMoney/PT/Corpus.hs
+++ b/Duckling/AmountOfMoney/PT/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/PT/Rules.hs b/Duckling/AmountOfMoney/PT/Rules.hs
--- a/Duckling/AmountOfMoney/PT/Rules.hs
+++ b/Duckling/AmountOfMoney/PT/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.PT.Rules
@@ -20,12 +21,26 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleIntersectAndNumeral :: Rule
 ruleIntersectAndNumeral = Rule
   { name = "intersect (and number)"
@@ -124,7 +139,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleBrl
+  [ ruleUnitAmount
+  , ruleBrl
   , ruleCent
   , ruleDollar
   , ruleIntersect
diff --git a/Duckling/AmountOfMoney/RO/Corpus.hs b/Duckling/AmountOfMoney/RO/Corpus.hs
--- a/Duckling/AmountOfMoney/RO/Corpus.hs
+++ b/Duckling/AmountOfMoney/RO/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/RO/Rules.hs b/Duckling/AmountOfMoney/RO/Rules.hs
--- a/Duckling/AmountOfMoney/RO/Rules.hs
+++ b/Duckling/AmountOfMoney/RO/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.RO.Rules
@@ -21,13 +22,27 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 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
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleIntersectAndNumeral :: Rule
 ruleIntersectAndNumeral = Rule
   { name = "intersect (and number)"
@@ -195,7 +210,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleAed
+  [ ruleUnitAmount
+  , ruleAed
   , ruleCent
   , ruleDollar
   , ruleInr
diff --git a/Duckling/AmountOfMoney/RU/Corpus.hs b/Duckling/AmountOfMoney/RU/Corpus.hs
--- a/Duckling/AmountOfMoney/RU/Corpus.hs
+++ b/Duckling/AmountOfMoney/RU/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/RU/Rules.hs b/Duckling/AmountOfMoney/RU/Rules.hs
--- a/Duckling/AmountOfMoney/RU/Rules.hs
+++ b/Duckling/AmountOfMoney/RU/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.RU.Rules
@@ -28,6 +29,20 @@
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleRuble :: Rule
 ruleRuble = Rule
   { name = "руб"
@@ -284,7 +299,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleBucks
+  [ ruleUnitAmount
+  , ruleBucks
   , ruleCent
   , ruleDollar
   , ruleEUR
diff --git a/Duckling/AmountOfMoney/Rules.hs b/Duckling/AmountOfMoney/Rules.hs
--- a/Duckling/AmountOfMoney/Rules.hs
+++ b/Duckling/AmountOfMoney/Rules.hs
@@ -40,6 +40,9 @@
   , ("byn", BYN)
   , ("¢", Cent)
   , ("c", Cent)
+  , ("cny", CNY)
+  , ("rmb", CNY)
+  , ("yuan", CNY)
   , ("$", Dollar)
   , ("dinar", Dinar)
   , ("dinars", Dinar)
@@ -103,7 +106,7 @@
 ruleCurrencies = Rule
   { name = "currencies"
   , pattern =
-    [ 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)"
+    [ regex "(aed|aud|bgn|brl|byn|¢|c|cny|\\$|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|yuan)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) -> do
@@ -117,7 +120,7 @@
   { name = "<amount> <unit>"
   , pattern =
     [ Predicate isPositive
-    , financeWith TAmountOfMoney.value isNothing
+    , Predicate isCurrencyOnly
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v}:
@@ -126,23 +129,8 @@
       _ -> Nothing
   }
 
-ruleUnitAmount :: Rule
-ruleUnitAmount = Rule
-  { name = "<unit> <amount>"
-  , pattern =
-    [ financeWith TAmountOfMoney.value isNothing
-    , Predicate isPositive
-    ]
-  , prod = \tokens -> case tokens of
-      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
-       Token Numeral NumeralData{TNumeral.value = v}:
-       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
-      _ -> Nothing
-  }
-
 rules :: [Rule]
 rules =
   [ ruleAmountUnit
   , ruleCurrencies
-  , ruleUnitAmount
   ]
diff --git a/Duckling/AmountOfMoney/SV/Corpus.hs b/Duckling/AmountOfMoney/SV/Corpus.hs
--- a/Duckling/AmountOfMoney/SV/Corpus.hs
+++ b/Duckling/AmountOfMoney/SV/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale SV Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/AmountOfMoney/SV/Rules.hs b/Duckling/AmountOfMoney/SV/Rules.hs
--- a/Duckling/AmountOfMoney/SV/Rules.hs
+++ b/Duckling/AmountOfMoney/SV/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.SV.Rules
@@ -20,12 +21,26 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleIntersectAndNumeral :: Rule
 ruleIntersectAndNumeral = Rule
   { name = "intersect (and number)"
@@ -157,7 +172,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleAboutAmountofmoney
+  [ ruleUnitAmount
+  , ruleAboutAmountofmoney
   , ruleCent
   , ruleDirham
   , ruleExactlyAmountofmoney
diff --git a/Duckling/AmountOfMoney/Types.hs b/Duckling/AmountOfMoney/Types.hs
--- a/Duckling/AmountOfMoney/Types.hs
+++ b/Duckling/AmountOfMoney/Types.hs
@@ -41,6 +41,7 @@
   | BGN
   | BRL
   | BYN
+  | CNY
   | EGP
   | EUR
   | GBP
@@ -82,6 +83,7 @@
   toJSON BGN     = "BGN"
   toJSON BRL     = "BRL"
   toJSON BYN     = "BYN"
+  toJSON CNY     = "CNY"
   toJSON EGP     = "EGP"
   toJSON EUR     = "EUR"
   toJSON GBP     = "GBP"
@@ -118,19 +120,19 @@
 
 instance Resolve AmountOfMoneyData where
   type ResolvedValue AmountOfMoneyData = AmountOfMoneyValue
-  resolve _ AmountOfMoneyData {value = Nothing, minValue = Nothing
+  resolve _ _ AmountOfMoneyData {value = Nothing, minValue = Nothing
                               , maxValue = Nothing} = Nothing
-  resolve _ AmountOfMoneyData {value = Just value, currency} =
-    Just $ simple currency value
-  resolve _ AmountOfMoneyData {value = Nothing, currency = c
+  resolve _ _ AmountOfMoneyData {value = Just value, currency} =
+    Just (simple currency value, False)
+  resolve _ _ AmountOfMoneyData {value = Nothing, currency = c
                               , minValue = Just from, maxValue = Just to} =
-    Just $ between c (from, to)
-  resolve _ AmountOfMoneyData {value = Nothing, currency = c
+    Just (between c (from, to), False)
+  resolve _ _ AmountOfMoneyData {value = Nothing, currency = c
                               , minValue = Just v, maxValue = Nothing} =
-    Just $ above c v
-  resolve _ AmountOfMoneyData {value = Nothing, currency = c
+    Just (above c v, False)
+  resolve _ _ AmountOfMoneyData {value = Nothing, currency = c
                               , minValue = Nothing, maxValue = Just v} =
-    Just $ under c v
+    Just (under c v, False)
 
 data IntervalDirection = Above | Under
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
diff --git a/Duckling/AmountOfMoney/VI/Corpus.hs b/Duckling/AmountOfMoney/VI/Corpus.hs
--- a/Duckling/AmountOfMoney/VI/Corpus.hs
+++ b/Duckling/AmountOfMoney/VI/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale VI Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale VI Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -37,12 +37,12 @@
              , "mười xu"
              ]
   , examples (simple Dollar 10000)
-             [ "$10,000"
+             [ "$10.000"
              , "10K$"
              , "$10k"
              ]
   , examples (simple USD 1.23)
-             [ "USD1.23"
+             [ "USD1,23"
              ]
   , examples (simple Dollar 2.23)
              [ "2 đô la và 23 xen"
@@ -56,7 +56,7 @@
              [ "mười đồng"
              ]
   , examples (simple VND 10000)
-             [ "10,000 đồng"
+             [ "10.000 đồng"
              , "10K đồng"
              , "10k đồng"
              ]
@@ -72,7 +72,7 @@
              , "EUR 20"
              ]
   , examples (simple EUR 29.99)
-             [ "EUR29.99"
+             [ "EUR29,99"
              ]
   , examples (simple INR 20)
              [ "Rs. 20"
@@ -94,8 +94,8 @@
              , "chín pounds"
              ]
   , examples (simple GBP 3.01)
-             [ "GBP3.01"
-             , "GBP 3.01"
+             [ "GBP3,01"
+             , "GBP 3,01"
              ]
   , examples (simple AED 1)
              [ "1 AED."
diff --git a/Duckling/AmountOfMoney/VI/Rules.hs b/Duckling/AmountOfMoney/VI/Rules.hs
--- a/Duckling/AmountOfMoney/VI/Rules.hs
+++ b/Duckling/AmountOfMoney/VI/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.AmountOfMoney.VI.Rules
@@ -20,12 +21,26 @@
 import Duckling.AmountOfMoney.Helpers
 import Duckling.AmountOfMoney.Types (Currency(..), AmountOfMoneyData (..))
 import Duckling.Dimensions.Types
-import Duckling.Numeral.Helpers (isNatural)
+import Duckling.Numeral.Helpers (isNatural, isPositive)
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.Types as TAmountOfMoney
 import qualified Duckling.Numeral.Types as TNumeral
 
+ruleUnitAmount :: Rule
+ruleUnitAmount = Rule
+  { name = "<unit> <amount>"
+  , pattern =
+    [ Predicate isCurrencyOnly
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.currency = c}:
+       Token Numeral NumeralData{TNumeral.value = v}:
+       _) -> Just . Token AmountOfMoney . withValue v $ currencyOnly c
+      _ -> Nothing
+  }
+
 ruleNg :: Rule
 ruleNg = Rule
   { name = "đồng"
@@ -142,7 +157,8 @@
 
 rules :: [Rule]
 rules =
-  [ ruleCent
+  [ ruleUnitAmount
+  , ruleCent
   , ruleDirham
   , ruleDollar
   , ruleIntersect
diff --git a/Duckling/AmountOfMoney/ZH/Corpus.hs b/Duckling/AmountOfMoney/ZH/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/ZH/Corpus.hs
@@ -0,0 +1,68 @@
+-- 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.ZH.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 ZH Nothing},
+  testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Cent 5)
+             [ "五分"
+             , "5分"
+             ]
+  , examples (simple Cent 20)
+             [ "20分"
+             , "二十分"
+             , "2角"
+             , "两毛"
+             ]
+  , examples (simple Cent 25)
+             [ "25分"
+             , "二十五分"
+             , "两角五分"
+             , "两毛五"
+             ]
+  , examples (simple Dollar 7)
+             [ "7块"
+             , "七元"
+             ]
+  , examples (simple CNY 3.14)
+             [ "3.14人民币"
+             , "人民幣3.14"
+             ]
+  , examples (under Dollar 1.2)
+             [ "1.2元以下"
+             , "最多一块二角"
+             , "最多一块二"
+             ]
+  , examples (above Dollar 3.04)
+             [ "3.04块以上"
+             , "至少三块四分"
+             , "至少三块零四"
+             ]
+  , examples (between Dollar (5.6, 5.78))
+             [ "5.6到5.78元"
+             , "五元六角-五元七毛八分"
+             , "五块六到五块七毛八"
+             ]
+  ]
diff --git a/Duckling/AmountOfMoney/ZH/Rules.hs b/Duckling/AmountOfMoney/ZH/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/AmountOfMoney/ZH/Rules.hs
@@ -0,0 +1,274 @@
+-- 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.AmountOfMoney.ZH.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.Helpers (isNatural, isPositive, oneOf)
+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
+
+ruleCNY :: Rule
+ruleCNY = Rule
+  { name = "cny"
+  , pattern =
+    [ regex "人民币|人民幣"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly CNY
+  }
+
+ruleCNYPrefix :: Rule
+ruleCNYPrefix = Rule
+  { name = "cny prefix"
+  , pattern =
+    [ regex "人民币|人民幣"
+    , Predicate isPositive
+    ]
+  , prod = \case
+      (_:Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token AmountOfMoney . withValue v $ currencyOnly CNY
+      _ -> Nothing
+  }
+
+ruleCent :: Rule
+ruleCent = Rule
+  { name = "cent"
+  , pattern =
+    [ regex "分"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Cent
+}
+
+ruleDime :: Rule
+ruleDime = Rule
+  { name = "dime"
+  , pattern =
+    [ Predicate isPositive
+    , regex "角|毛"
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:_) ->
+        Just . Token AmountOfMoney $
+        withCents (v * 10) $ currencyOnly Cent
+      _ -> Nothing
+  }
+
+ruleDollar :: Rule
+ruleDollar = Rule
+  { name = "dollar"
+  , pattern =
+    [ regex "元|圆|块"
+    ]
+  , prod = \_ -> Just . Token AmountOfMoney $ currencyOnly Dollar
+  }
+
+rulePrecision :: Rule
+rulePrecision = Rule
+  { name = "exactly/about <amount-of-money>"
+  , pattern =
+    [ regex "刚好|恰好|大概"
+    , Predicate isMoneyWithValue
+    ]
+  , prod = \case
+      (_:token:_) -> Just token
+      _ -> Nothing
+  }
+
+rulePrecision2 :: Rule
+rulePrecision2 = Rule
+  { name = "about <amount-of-money>"
+  , pattern =
+    [ Predicate isMoneyWithValue
+    , regex "左右"
+    ]
+  , prod = \case
+      (token:_) -> Just token
+      _ -> Nothing
+  }
+
+ruleIntersectDimesAndCents :: Rule
+ruleIntersectDimesAndCents = Rule
+  { name = "intersect (X dimes and X cents)"
+  , pattern =
+    [ Predicate $ and . sequence [isSimpleAmountOfMoney, isDime]
+    , Predicate $ and . sequence [isSimpleAmountOfMoney, isCent]
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just d}:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) ->
+         Just . Token AmountOfMoney $ withCents (c + d) $ currencyOnly Cent
+      _ -> Nothing
+  }
+
+ruleIntersectDollarsAndDimesCents :: Rule
+ruleIntersectDollarsAndDimesCents = Rule
+  { name = "intersect (X dollars and X dimes/cents)"
+  , pattern =
+    [ Predicate $ and . sequence [isSimpleAmountOfMoney, isWithoutCents]
+    , Predicate $ and . sequence [isSimpleAmountOfMoney, isCents]
+    ]
+  , prod = \case
+      (Token AmountOfMoney fd:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersect :: Rule
+ruleIntersect = Rule
+  { name = "intersect (implicit 0 delimited cents)"
+  , pattern =
+    [ Predicate $ and . sequence [isSimpleAmountOfMoney, isWithoutCents]
+    , regex "0|零|〇"
+    , oneOf [1..9]
+    ]
+  , prod = \case
+      (Token AmountOfMoney fd:_:
+       Token Numeral NumeralData{TNumeral.value = c}:
+       _) -> Just . Token AmountOfMoney $ withCents c fd
+      _ -> Nothing
+  }
+
+ruleIntersect2 :: Rule
+ruleIntersect2 = Rule
+  { name = "intersect (implicit unitless cents)"
+  , pattern =
+    [ Predicate $ and . sequence [isSimpleAmountOfMoney, isDime]
+    , Predicate isNatural
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just v}:
+       Token Numeral NumeralData{TNumeral.value = c}:
+       _) -> Just . Token AmountOfMoney $ withCents (v + c) $ currencyOnly Cent
+      _ -> Nothing
+  }
+
+ruleIntersect3 :: Rule
+ruleIntersect3 = Rule
+  { name = "intersect (implicit unitless dimes)"
+  , pattern =
+    [ Predicate $ and . sequence [isSimpleAmountOfMoney, isWithoutCents]
+    , Predicate isNatural
+    ]
+  , prod = \case
+      (Token AmountOfMoney fd:
+       Token Numeral NumeralData{TNumeral.value = d}:
+       _) -> Just . Token AmountOfMoney $ withCents (d * 10) fd
+      _ -> Nothing
+  }
+
+ruleIntervalNumeralDash :: Rule
+ruleIntervalNumeralDash = Rule
+  { name = "<numeral> - <amount-of-money>"
+  , pattern =
+    [ Predicate isPositive
+    , regex "-|~|到"
+    , financeWith TAmountOfMoney.value isJust
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = from}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) | from < to ->
+         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 = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just from,
+                  TAmountOfMoney.currency = c1}:
+       _:
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c2}:
+       _) | from < to && c1 == c2 ->
+        Just . Token AmountOfMoney . withInterval (from, to) $ currencyOnly c1
+      _ -> Nothing
+  }
+
+ruleIntervalBound :: Rule
+ruleIntervalBound = Rule
+  { name = "under/less/lower/no more than <amount-of-money> (最多|至少|最少)"
+  , pattern =
+    [ regex "(最多|至少|最少)"
+    , financeWith TAmountOfMoney.value isJust
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       _) -> case match of
+        "最多" -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
+        "最少" -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+        "至少" -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+        _ -> Nothing
+      _ -> Nothing
+  }
+
+ruleIntervalBound2 :: Rule
+ruleIntervalBound2 = Rule
+  { name = "under/less/lower/no more than <amount-of-money> (以下|以上)"
+  , pattern =
+    [ financeWith TAmountOfMoney.value isJust
+    , regex "(以下|以上)"
+    ]
+  , prod = \case
+      (Token AmountOfMoney AmountOfMoneyData{TAmountOfMoney.value = Just to,
+                  TAmountOfMoney.currency = c}:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case match of
+        "以下" -> Just . Token AmountOfMoney . withMax to $ currencyOnly c
+        "以上" -> Just . Token AmountOfMoney . withMin to $ currencyOnly c
+        _ -> Nothing
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleCent
+  , ruleCNY
+  , ruleCNYPrefix
+  , ruleDime
+  , ruleDollar
+  , ruleIntersect
+  , ruleIntersect2
+  , ruleIntersect3
+  , ruleIntersectDimesAndCents
+  , ruleIntersectDollarsAndDimesCents
+  , ruleIntervalDash
+  , ruleIntervalNumeralDash
+  , ruleIntervalBound
+  , ruleIntervalBound2
+  , rulePrecision
+  , rulePrecision2
+  ]
diff --git a/Duckling/Api.hs b/Duckling/Api.hs
--- a/Duckling/Api.hs
+++ b/Duckling/Api.hs
@@ -21,7 +21,6 @@
 import Data.HashSet (HashSet)
 import Data.Text (Text)
 import Prelude
-import TextShow
 import qualified Data.HashMap.Strict as HashMap
 import qualified Data.HashSet as HashSet
 import qualified Data.Text as Text
@@ -37,8 +36,9 @@
 import Duckling.Types
 
 -- | Parses `input` and returns a curated list of entities found.
-parse :: Text -> Context -> [Some Dimension] -> [Entity]
-parse input ctx = map (formatToken input) . analyze input ctx . HashSet.fromList
+parse :: Text -> Context -> Options -> [Some Dimension] -> [Entity]
+parse input ctx options = map (formatToken input) . analyze input ctx options .
+  HashSet.fromList
 
 supportedDimensions :: HashMap Lang [Some Dimension]
 supportedDimensions =
@@ -46,18 +46,19 @@
 
 -- | Returns a curated list of resolved tokens found
 -- When `targets` is non-empty, returns only tokens of such dimensions.
-analyze :: Text -> Context -> HashSet (Some Dimension) -> [ResolvedToken]
-analyze input context@Context{..} targets =
+analyze :: Text -> Context -> Options -> HashSet (Some Dimension)
+  -> [ResolvedToken]
+analyze input context@Context{..} options targets =
   rank (classifiers locale) targets
   . filter (\Resolved{node = Node{token = (Token d _)}} ->
       HashSet.null targets || HashSet.member (This d) targets
     )
-  $ parseAndResolve (rulesFor locale targets) input context
+  $ parseAndResolve (rulesFor locale targets) input context options
 
 -- | Converts the resolved token to the API format
 formatToken :: Text -> ResolvedToken -> Entity
 formatToken sentence
-  (Resolved (Range start end) node@Node{token = Token dimension _} value) =
-  Entity (toName dimension) body value start end node
+  (Resolved (Range start end) node@Node{token = Token dimension _} value latent)
+  = Entity (toName dimension) body value start end latent node
   where
     body = Text.drop start $ Text.take end sentence
diff --git a/Duckling/Core.hs b/Duckling/Core.hs
--- a/Duckling/Core.hs
+++ b/Duckling/Core.hs
@@ -12,13 +12,14 @@
 
 module Duckling.Core
   ( Context(..)
-  , Region(..)
   , Dimension(..)
   , Entity(..)
-  , Node(..)
-  , Range(..)
   , Lang(..)
   , Locale
+  , Node(..)
+  , Options(..)
+  , Range(..)
+  , Region(..)
   , Some(..)
   , fromName
   , makeLocale
@@ -36,7 +37,6 @@
   ) where
 
 import Data.HashMap.Strict (HashMap)
-import Data.Maybe
 import Data.Text (Text)
 import Data.Time
 import Data.Time.LocalTime.TimeZone.Series
diff --git a/Duckling/Debug.hs b/Duckling/Debug.hs
--- a/Duckling/Debug.hs
+++ b/Duckling/Debug.hs
@@ -13,7 +13,7 @@
 module Duckling.Debug
   ( allParses
   , debug
-  , debugContext
+  , debugCustom
   , fullParses
   , ptree
   ) where
@@ -38,7 +38,7 @@
 -- API
 
 debug :: Locale -> Text -> [Some Dimension] -> IO [Entity]
-debug locale = debugContext testContext {locale = locale}
+debug locale = debugCustom testContext {locale = locale} testOptions
 
 allParses :: Locale -> Text -> [Some Dimension] -> IO [Entity]
 allParses l sentence targets = debugTokens sentence $ parses l sentence targets
@@ -50,8 +50,13 @@
   where
     n = Text.length sentence
 
+debugCustom :: Context -> Options -> Text -> [Some Dimension] -> IO [Entity]
+debugCustom context options sentence targets = debugTokens sentence .
+  analyze sentence context options $ HashSet.fromList targets
+
 ptree :: Text -> Entity -> IO ()
 ptree sentence Entity {enode} = pnode sentence 0 enode
+
 -- -----------------------------------------------------------------
 -- Internals
 
@@ -62,12 +67,8 @@
       [] -> True
       _ -> elem (This d) targets
   where
-    tokens = parseAndResolve rules sentence testContext {locale = l}
+    tokens = parseAndResolve rules sentence testContext {locale = l} testOptions
     rules = rulesFor l $ HashSet.fromList targets
-
-debugContext :: Context -> Text -> [Some Dimension] -> IO [Entity]
-debugContext context sentence targets =
-  debugTokens sentence . analyze sentence context $ HashSet.fromList targets
 
 debugTokens :: Text -> [ResolvedToken] -> IO [Entity]
 debugTokens sentence tokens = do
diff --git a/Duckling/Dimensions.hs b/Duckling/Dimensions.hs
--- a/Duckling/Dimensions.hs
+++ b/Duckling/Dimensions.hs
@@ -19,6 +19,8 @@
 import qualified Data.HashSet as HashSet
 
 import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
 import qualified Duckling.Dimensions.Common as CommonDimensions
 import qualified Duckling.Dimensions.AR as ARDimensions
 import qualified Duckling.Dimensions.BG as BGDimensions
@@ -49,11 +51,11 @@
 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.TA as TADimensions
 import qualified Duckling.Dimensions.TR as TRDimensions
 import qualified Duckling.Dimensions.UK as UKDimensions
 import qualified Duckling.Dimensions.VI as VIDimensions
 import qualified Duckling.Dimensions.ZH as ZHDimensions
-import Duckling.Locale
 
 allDimensions :: Lang -> [Some Dimension]
 allDimensions lang = CommonDimensions.allDimensions ++ langDimensions lang
@@ -81,6 +83,7 @@
 dependents (This TimeGrain) = HashSet.empty
 dependents (This Url) = HashSet.empty
 dependents (This Volume) = HashSet.singleton (This Numeral)
+dependents (This (CustomDimension dim)) = dimDependents dim
 
 langDimensions :: Lang -> [Some Dimension]
 langDimensions AR = ARDimensions.allDimensions
@@ -112,6 +115,7 @@
 langDimensions RO = RODimensions.allDimensions
 langDimensions RU = RUDimensions.allDimensions
 langDimensions SV = SVDimensions.allDimensions
+langDimensions TA = TADimensions.allDimensions
 langDimensions TR = TRDimensions.allDimensions
 langDimensions UK = UKDimensions.allDimensions
 langDimensions VI = VIDimensions.allDimensions
diff --git a/Duckling/Dimensions/BG.hs b/Duckling/Dimensions/BG.hs
--- a/Duckling/Dimensions/BG.hs
+++ b/Duckling/Dimensions/BG.hs
@@ -14,5 +14,8 @@
 
 allDimensions :: [Some Dimension]
 allDimensions =
-  [ This Numeral
+  [ This Distance
+  , This Duration
+  , This Numeral
+  , This Ordinal
   ]
diff --git a/Duckling/Dimensions/SV.hs b/Duckling/Dimensions/SV.hs
--- a/Duckling/Dimensions/SV.hs
+++ b/Duckling/Dimensions/SV.hs
@@ -14,7 +14,8 @@
 
 allDimensions :: [Some Dimension]
 allDimensions =
-  [ This Duration
+  [ This Distance
+  , This Duration
   , This Numeral
   , This Ordinal
   , This Time
diff --git a/Duckling/Dimensions/TA.hs b/Duckling/Dimensions/TA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Dimensions/TA.hs
@@ -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.TA
+  ( allDimensions
+  ) where
+
+import Duckling.Dimensions.Types
+
+allDimensions :: [Some Dimension]
+allDimensions =
+  [ This Numeral
+  ]
diff --git a/Duckling/Dimensions/Types.hs b/Duckling/Dimensions/Types.hs
--- a/Duckling/Dimensions/Types.hs
+++ b/Duckling/Dimensions/Types.hs
@@ -6,12 +6,8 @@
 -- of patent rights can be found in the PATENTS file in the same directory.
 
 
-
-{-# LANGUAGE ExistentialQuantification #-}
-{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoRebindableSyntax #-}
-{-# LANGUAGE TypeOperators #-}
 
 
 module Duckling.Dimensions.Types
@@ -22,99 +18,14 @@
   , toName
   ) where
 
-import Data.GADT.Compare
-import Data.GADT.Show
-import Data.Hashable
-import qualified Data.HashMap.Strict as HashMap
 import Data.Maybe
 import Data.Some
 import Data.Text (Text)
--- Intentionally limit use of Typeable to avoid casting or typeOf usage
-import Data.Typeable ((:~:)(..))
-import TextShow (TextShow(..))
-import qualified TextShow as TS
 import Prelude
-
-import Duckling.AmountOfMoney.Types (AmountOfMoneyData)
-import Duckling.Distance.Types (DistanceData)
-import Duckling.Duration.Types (DurationData)
-import Duckling.Email.Types (EmailData)
-import Duckling.Numeral.Types (NumeralData)
-import Duckling.Ordinal.Types (OrdinalData)
-import Duckling.PhoneNumber.Types (PhoneNumberData)
-import Duckling.Quantity.Types (QuantityData)
-import Duckling.Regex.Types (GroupMatch)
-import Duckling.Temperature.Types (TemperatureData)
-import Duckling.Time.Types (TimeData)
-import Duckling.TimeGrain.Types (Grain)
-import Duckling.Url.Types (UrlData)
-import Duckling.Volume.Types (VolumeData)
-
--- -----------------------------------------------------------------
--- Dimension
-
--- | GADT for differentiating between dimensions
--- Each dimension should have its own constructor and provide the data structure
--- for its parsed data
-data Dimension a where
-  RegexMatch :: Dimension GroupMatch
-  AmountOfMoney :: Dimension AmountOfMoneyData
-  Distance :: Dimension DistanceData
-  Duration :: Dimension DurationData
-  Email :: Dimension EmailData
-  Numeral :: Dimension NumeralData
-  Ordinal :: Dimension OrdinalData
-  PhoneNumber :: Dimension PhoneNumberData
-  Quantity :: Dimension QuantityData
-  Temperature :: Dimension TemperatureData
-  Time :: Dimension TimeData
-  TimeGrain :: Dimension Grain
-  Url :: Dimension UrlData
-  Volume :: Dimension VolumeData
-
--- Show
-instance Show (Dimension a) where
-  show RegexMatch = "RegexMatch"
-  show Distance = "Distance"
-  show Duration = "Duration"
-  show Email = "Email"
-  show AmountOfMoney = "AmountOfMoney"
-  show Numeral = "Numeral"
-  show Ordinal = "Ordinal"
-  show PhoneNumber = "PhoneNumber"
-  show Quantity = "Quantity"
-  show Temperature = "Temperature"
-  show Time = "Time"
-  show TimeGrain = "TimeGrain"
-  show Url = "Url"
-  show Volume = "Volume"
-instance GShow Dimension where gshowsPrec = showsPrec
-
--- TextShow
-instance TextShow (Dimension a) where
-  showb d = TS.fromString $ show d
-instance TextShow (Some Dimension) where
-  showb (This d) = showb d
-
--- Hashable
-instance Hashable (Some Dimension) where
-  hashWithSalt s (This a) = hashWithSalt s a
-instance Hashable (Dimension a) where
-  hashWithSalt s RegexMatch  = hashWithSalt s (0::Int)
-  hashWithSalt s Distance    = hashWithSalt s (1::Int)
-  hashWithSalt s Duration    = hashWithSalt s (2::Int)
-  hashWithSalt s Email       = hashWithSalt s (3::Int)
-  hashWithSalt s AmountOfMoney     = hashWithSalt s (4::Int)
-  hashWithSalt s Numeral     = hashWithSalt s (5::Int)
-  hashWithSalt s Ordinal     = hashWithSalt s (6::Int)
-  hashWithSalt s PhoneNumber = hashWithSalt s (7::Int)
-  hashWithSalt s Quantity    = hashWithSalt s (8::Int)
-  hashWithSalt s Temperature = hashWithSalt s (9::Int)
-  hashWithSalt s Time        = hashWithSalt s (10::Int)
-  hashWithSalt s TimeGrain   = hashWithSalt s (11::Int)
-  hashWithSalt s Url         = hashWithSalt s (12::Int)
-  hashWithSalt s Volume      = hashWithSalt s (13::Int)
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
 
+import Duckling.Types
 
 toName :: Dimension a -> Text
 toName RegexMatch = "regex"
@@ -131,6 +42,7 @@
 toName TimeGrain = "time-grain"
 toName Url = "url"
 toName Volume = "volume"
+toName (CustomDimension dim) = Text.pack (show dim)
 
 fromName :: Text -> Maybe (Some Dimension)
 fromName name = HashMap.lookup name m
@@ -149,33 +61,3 @@
       , ("url", This Url)
       , ("volume", This Volume)
       ]
-
-instance GEq Dimension where
-  geq RegexMatch RegexMatch = Just Refl
-  geq RegexMatch _ = Nothing
-  geq Distance Distance = Just Refl
-  geq Distance _ = Nothing
-  geq Duration Duration = Just Refl
-  geq Duration _ = Nothing
-  geq Email Email = Just Refl
-  geq Email _ = Nothing
-  geq AmountOfMoney AmountOfMoney = Just Refl
-  geq AmountOfMoney _ = Nothing
-  geq Numeral Numeral = Just Refl
-  geq Numeral _ = Nothing
-  geq Ordinal Ordinal = Just Refl
-  geq Ordinal _ = Nothing
-  geq PhoneNumber PhoneNumber = Just Refl
-  geq PhoneNumber _ = Nothing
-  geq Quantity Quantity = Just Refl
-  geq Quantity _ = Nothing
-  geq Temperature Temperature = Just Refl
-  geq Temperature _ = Nothing
-  geq Time Time = Just Refl
-  geq Time _ = Nothing
-  geq TimeGrain TimeGrain = Just Refl
-  geq TimeGrain _ = Nothing
-  geq Url Url = Just Refl
-  geq Url _ = Nothing
-  geq Volume Volume = Just Refl
-  geq Volume _ = Nothing
diff --git a/Duckling/Dimensions/ZH.hs b/Duckling/Dimensions/ZH.hs
--- a/Duckling/Dimensions/ZH.hs
+++ b/Duckling/Dimensions/ZH.hs
@@ -14,7 +14,8 @@
 
 allDimensions :: [Some Dimension]
 allDimensions =
-  [ This Duration
+  [ This Distance
+  , This Duration
   , This Numeral
   , This Ordinal
   , This Temperature
diff --git a/Duckling/Distance/BG/Corpus.hs b/Duckling/Distance/BG/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/BG/Corpus.hs
@@ -0,0 +1,66 @@
+-- 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.BG.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Distance.Types
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale BG Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Kilometre 3)
+             [ "3 километра"
+             , "3 км"
+             , "3км"
+             , "3.0 км"
+             ]
+  , examples (simple Mile 8)
+             [ "8 мили"
+             , "осем мили"
+             ]
+  , examples (simple Metre 1)
+             [ "1 м",
+               "1 метър",
+               "един метър"
+             ]
+  , examples (simple Centimetre 2)
+             [ "2см"
+             , "2 сантиметра"
+             ]
+  , examples (simple Millimetre 4)
+             [ "4мм"
+             , "4 милиметра"
+             ]
+  , examples (simple Inch 5)
+             [ "5 инча"
+             , "5''"
+             , "пет инча"
+             , "5\""
+             ]
+  , examples (simple Foot 35)
+             [ "35 фута"
+             , "35'"
+             , "тридесет и пет фута"
+             ]
+  , examples (simple Yard 47)
+             [ "47 ярда"
+             , "четиридесет и седем ярда"
+             ]
+  ]
diff --git a/Duckling/Distance/BG/Rules.hs b/Duckling/Distance/BG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/BG/Rules.hs
@@ -0,0 +1,50 @@
+-- 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.Distance.BG.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.Helpers
+import Duckling.Distance.Types (DistanceData(..))
+import Duckling.Types
+import qualified Duckling.Distance.Types as TDistance
+
+distances :: [(Text, String, TDistance.Unit)]
+distances = [ ("<latent dist> km", "км|километ(ра|ри|ър)", TDistance.Kilometre)
+            , ("<latent dist> feet", "('|фут(а|ове)?)", TDistance.Foot)
+            , ("<latent dist> inch", "(\"|''|инч(а|ове)?)", TDistance.Inch)
+            , ("<latent dist> yard", "ярд(а|ове)?", TDistance.Yard)
+            , ("<dist> meters", "м(етър|етр(а|и))?", TDistance.Metre)
+            , ("<dist> centimeters", "см|сантимет(ри|ра|ър)", TDistance.Centimetre)
+            , ("<dist> millimeters", "мм|милимет(ра|ри|ър)", TDistance.Millimetre)
+            , ("<dist> miles", "мил(я|и)", TDistance.Mile)
+            ]
+
+ruleDistances :: [Rule]
+ruleDistances = map go distances
+  where
+    go :: (Text, String, TDistance.Unit) -> Rule
+    go (name, regexPattern, u) = Rule
+      { name = name
+      , pattern = [ dimension Distance, regex regexPattern ]
+      , prod = \tokens -> case tokens of
+          (Token Distance dd:_) -> Just . Token Distance $ withUnit u dd
+          _ -> Nothing
+      }
+
+rules :: [Rule]
+rules = ruleDistances
diff --git a/Duckling/Distance/CS/Corpus.hs b/Duckling/Distance/CS/Corpus.hs
--- a/Duckling/Distance/CS/Corpus.hs
+++ b/Duckling/Distance/CS/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale CS Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale CS Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/EN/Corpus.hs b/Duckling/Distance/EN/Corpus.hs
--- a/Duckling/Distance/EN/Corpus.hs
+++ b/Duckling/Distance/EN/Corpus.hs
@@ -9,16 +9,17 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Distance.EN.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.Distance.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/ES/Corpus.hs b/Duckling/Distance/ES/Corpus.hs
--- a/Duckling/Distance/ES/Corpus.hs
+++ b/Duckling/Distance/ES/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/FR/Corpus.hs b/Duckling/Distance/FR/Corpus.hs
--- a/Duckling/Distance/FR/Corpus.hs
+++ b/Duckling/Distance/FR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/GA/Corpus.hs b/Duckling/Distance/GA/Corpus.hs
--- a/Duckling/Distance/GA/Corpus.hs
+++ b/Duckling/Distance/GA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/HR/Corpus.hs b/Duckling/Distance/HR/Corpus.hs
--- a/Duckling/Distance/HR/Corpus.hs
+++ b/Duckling/Distance/HR/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/KO/Corpus.hs b/Duckling/Distance/KO/Corpus.hs
--- a/Duckling/Distance/KO/Corpus.hs
+++ b/Duckling/Distance/KO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/NL/Corpus.hs b/Duckling/Distance/NL/Corpus.hs
--- a/Duckling/Distance/NL/Corpus.hs
+++ b/Duckling/Distance/NL/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/PT/Corpus.hs b/Duckling/Distance/PT/Corpus.hs
--- a/Duckling/Distance/PT/Corpus.hs
+++ b/Duckling/Distance/PT/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/RO/Corpus.hs b/Duckling/Distance/RO/Corpus.hs
--- a/Duckling/Distance/RO/Corpus.hs
+++ b/Duckling/Distance/RO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/RU/Corpus.hs b/Duckling/Distance/RU/Corpus.hs
--- a/Duckling/Distance/RU/Corpus.hs
+++ b/Duckling/Distance/RU/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/Rules.hs b/Duckling/Distance/Rules.hs
--- a/Duckling/Distance/Rules.hs
+++ b/Duckling/Distance/Rules.hs
@@ -20,8 +20,8 @@
 import Duckling.Dimensions.Types
 import Duckling.Distance.Helpers
 import Duckling.Numeral.Types (NumeralData (..))
-import qualified Duckling.Numeral.Types as TNumeral
 import Duckling.Types
+import qualified Duckling.Numeral.Types as TNumeral
 
 ruleNumeralAsDistance :: Rule
 ruleNumeralAsDistance = Rule
diff --git a/Duckling/Distance/SV/Corpus.hs b/Duckling/Distance/SV/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/SV/Corpus.hs
@@ -0,0 +1,50 @@
+-- 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.SV.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 SV Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (simple Kilometre 3)
+             [ "3 kilometer"
+             , "3 km"
+             , "3km"
+             , "3k"
+             ]
+  , examples (simple Kilometre 30)
+             [ "3 mil"
+             , "tre mil"
+             , "några få mil"
+             ]
+  , examples (simple Kilometre 3.0)
+             [ "3,0 km"
+             ]
+  , examples (simple Metre 9)
+             [ "9 meter"
+             , "9m"
+             ]
+  , examples (simple Centimetre 2)
+             [ "2cm"
+             , "2 centimeter"
+             ]
+  ]
diff --git a/Duckling/Distance/SV/Rules.hs b/Duckling/Distance/SV/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/SV/Rules.hs
@@ -0,0 +1,84 @@
+-- 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.Distance.SV.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.Helpers
+import Duckling.Distance.Types (DistanceData(..))
+import Duckling.Types
+import qualified Duckling.Distance.Types as TDistance
+
+ruleLatentDistKm :: Rule
+ruleLatentDistKm = Rule
+  { name = "<latent dist> km"
+  , pattern =
+    [ dimension Distance
+    , regex "k(ilo)?m?(eter)?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd:_) ->
+        Just . Token Distance $ withUnit TDistance.Kilometre dd
+      _ -> Nothing
+  }
+
+ruleDistMeters :: Rule
+ruleDistMeters = Rule
+  { name = "<dist> meter"
+  , pattern =
+    [ dimension Distance
+    , regex "m(eter)?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd:_) ->
+        Just . Token Distance $ withUnit TDistance.Metre dd
+      _ -> Nothing
+  }
+
+ruleDistCentimeters :: Rule
+ruleDistCentimeters = Rule
+  { name = "<dist> centimeters"
+  , pattern =
+    [ dimension Distance
+    , regex "cm|centimeter"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd:_) ->
+        Just . Token Distance $ withUnit TDistance.Centimetre dd
+      _ -> Nothing
+  }
+
+ruleDistMils :: Rule
+ruleDistMils = Rule
+  { name = "<dist> mils"
+  , pattern =
+    [ dimension Distance
+    , regex "mils?"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Distance dd@DistanceData {TDistance.value = Just x}:_) ->
+        Just . Token Distance . withValue (10 * x)
+          $ withUnit TDistance.Kilometre dd
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDistCentimeters
+  , ruleDistMeters
+  , ruleDistMils
+  , ruleLatentDistKm
+  ]
diff --git a/Duckling/Distance/TR/Corpus.hs b/Duckling/Distance/TR/Corpus.hs
--- a/Duckling/Distance/TR/Corpus.hs
+++ b/Duckling/Distance/TR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Distance/Types.hs b/Duckling/Distance/Types.hs
--- a/Duckling/Distance/Types.hs
+++ b/Duckling/Distance/Types.hs
@@ -51,18 +51,18 @@
 
 instance Resolve DistanceData where
   type ResolvedValue DistanceData = DistanceValue
-  resolve _ DistanceData {unit = Just unit, value = Just val} =
-    Just $ simple unit val
-  resolve _ DistanceData {unit = Just unit, value = Nothing
+  resolve _ _ DistanceData {unit = Just unit, value = Just val} =
+    Just (simple unit val, False)
+  resolve _ _ DistanceData {unit = Just unit, value = Nothing
                          , minValue = Just from, maxValue = Just to} =
-    Just $ between unit (from, to)
-  resolve _ DistanceData {unit = Just unit, value = Nothing
+    Just (between unit (from, to), False)
+  resolve _ _ DistanceData {unit = Just unit, value = Nothing
                          , minValue = Just from, maxValue = Nothing} =
-    Just $ above unit from
-  resolve _ DistanceData {unit = Just unit, value = Nothing
+    Just (above unit from, False)
+  resolve _ _ DistanceData {unit = Just unit, value = Nothing
                          , minValue = Nothing, maxValue = Just to} =
-    Just $ under unit to
-  resolve _ _ = Nothing
+    Just (under unit to, False)
+  resolve _ _ _ = Nothing
 
 data IntervalDirection = Above | Under
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
diff --git a/Duckling/Distance/ZH/Corpus.hs b/Duckling/Distance/ZH/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/ZH/Corpus.hs
@@ -0,0 +1,72 @@
+-- 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 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英里"
+             , "一英裏"
+             ]
+  ]
diff --git a/Duckling/Distance/ZH/Rules.hs b/Duckling/Distance/ZH/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Distance/ZH/Rules.hs
@@ -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
+  ]
diff --git a/Duckling/Duration/AR/Corpus.hs b/Duckling/Duration/AR/Corpus.hs
--- a/Duckling/Duration/AR/Corpus.hs
+++ b/Duckling/Duration/AR/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/BG/Corpus.hs b/Duckling/Duration/BG/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/BG/Corpus.hs
@@ -0,0 +1,95 @@
+-- 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.Duration.BG.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Duration.Types
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Types
+import Duckling.TimeGrain.Types (Grain(..))
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale BG Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (DurationData 1 Second)
+             [ "1 сек"
+             , "1 секунда"
+             , "секунда"
+             , "1\""
+             ]
+  , examples (DurationData 15 Minute)
+             [ "15 мин"
+             , "петнадесет минути"
+             , "15'"
+             ]
+  , examples (DurationData 30 Minute)
+             [ "30 минути"
+             , "половин час"
+             , "тридесет минути"
+             ]
+  , examples (DurationData 90 Minute)
+             [ "час и половина"
+             , "90 мин"
+             ]
+  , examples (DurationData 5400 Second)
+             [ "1.5 часа"
+             , "5400 секунди"
+             ]
+  , examples (DurationData 8 Hour)
+             [ "8 часа"
+             , "8 ч"
+             , "осем часа"
+             ]
+  , examples (DurationData 15 Day)
+             [ "15 дни"
+             , "петнадесет дни"
+             , "половин месец"
+             ]
+  , examples (DurationData 7 Week)
+             [ "7 седмици"
+             , "седем седмици"
+             ]
+  , examples (DurationData 1 Month)
+             [ "1 месец"
+             , "месец"
+             ]
+  , examples (DurationData 6 Month)
+             [ "6 месеца"
+             , "шест месеца"
+             , "половин година"
+             ]
+  , examples (DurationData 9072000 Second)
+             [ "3.5 месеца"
+             , "приблизително 3.5 месеца"
+             ]
+  , examples (DurationData 30 Month)
+             [ "две години и половина"
+             , "2 години и половина"
+             ]
+  , examples (DurationData 3 Quarter)
+             [ "3 тримесечия"
+             ]
+  , examples (DurationData 2 Year)
+             [ "2 години"
+             , "две години"
+             ]
+  , examples (DurationData 12 Hour)
+             [ "12 часа"
+             , "дванадесет часа"
+             ]
+  ]
diff --git a/Duckling/Duration/BG/Rules.hs b/Duckling/Duration/BG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Duration/BG/Rules.hs
@@ -0,0 +1,134 @@
+-- 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 NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Duckling.Duration.BG.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+import qualified Data.Text as Text
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.Helpers
+import Duckling.Numeral.Helpers (numberWith)
+import Duckling.Numeral.Types (NumeralData(..), isInteger)
+import Duckling.Duration.Types (DurationData (DurationData))
+import Duckling.Regex.Types
+import Duckling.Types
+import Duckling.TimeGrain.Types
+import qualified Duckling.Numeral.Types as TNumeral
+
+ruleHalves :: Rule
+ruleHalves = Rule
+  { name = "half of a <time-grain>"
+  , pattern =
+    [ regex "половин"
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (_:Token TimeGrain grain:_) -> Token Duration <$> timesOneAndAHalf grain 0
+      _ -> Nothing
+  }
+
+ruleGrainAndAHalf :: Rule
+ruleGrainAndAHalf = Rule
+  { name = "<time-grain> and a half"
+  , pattern =
+    [ dimension TimeGrain
+    , regex "и половина"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token TimeGrain grain:_) -> Token Duration <$> timesOneAndAHalf grain 1
+      _ -> Nothing
+  }
+
+ruleDurationAndAHalf :: Rule
+ruleDurationAndAHalf = Rule
+  { name = "<positive-numeral> <time-grain> and a half"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex "и половина"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain grain:
+       _) -> timesOneAndAHalf grain (floor $ v) >>= Just . Token Duration
+      _ -> Nothing
+  }
+
+ruleNumeralQuotes :: Rule
+ruleNumeralQuotes = Rule
+  { name = "<integer> + '\""
+  , pattern =
+    [ Predicate isNatural
+    , regex "(['\"])"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token RegexMatch (GroupMatch (x:_)):
+       _) -> case x of
+         "'"  -> Just . Token Duration . duration Minute $ floor v
+         "\"" -> Just . Token Duration . duration Second $ floor v
+         _    -> Nothing
+      _ -> Nothing
+  }
+
+ruleDurationPrecision :: Rule
+ruleDurationPrecision = Rule
+  { name = "about|exactly <duration>"
+  , pattern =
+    [ regex "(към|приблизително|примерно|някъде)"
+    , dimension Duration
+    ]
+    , prod = \tokens -> case tokens of
+        (_:token:_) -> Just token
+        _ -> Nothing
+  }
+
+ruleGrainAsDuration :: Rule
+ruleGrainAsDuration = Rule
+  { name = "a <unit-of-duration>"
+  , pattern =
+    [ dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (Token TimeGrain grain:_) -> Just . Token Duration $ duration grain 1
+      _ -> Nothing
+  }
+
+rulePositiveDuration :: Rule
+rulePositiveDuration = Rule
+  { name = "<positive-numeral> <time-grain>"
+  , pattern =
+    [ numberWith TNumeral.value $ and . sequence [not . isInteger, (>0)]
+    , dimension TimeGrain
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain grain:
+       _) -> Just . Token Duration . duration Second . floor $ inSeconds grain v
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleDurationAndAHalf
+  , ruleGrainAndAHalf
+  , rulePositiveDuration
+  , ruleDurationPrecision
+  , ruleNumeralQuotes
+  , ruleGrainAsDuration
+  , ruleHalves
+  ]
diff --git a/Duckling/Duration/EL/Corpus.hs b/Duckling/Duration/EL/Corpus.hs
--- a/Duckling/Duration/EL/Corpus.hs
+++ b/Duckling/Duration/EL/Corpus.hs
@@ -26,10 +26,10 @@
 context = testContext {locale = makeLocale EL Nothing}
 
 corpus :: Corpus
-corpus = (context, allExamples)
+corpus = (context, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (context, examples)
+negativeCorpus = (context, testOptions, examples)
   where
     examples =
       [ "για μήνες"
diff --git a/Duckling/Duration/EN/Corpus.hs b/Duckling/Duration/EN/Corpus.hs
--- a/Duckling/Duration/EN/Corpus.hs
+++ b/Duckling/Duration/EN/Corpus.hs
@@ -21,10 +21,10 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "for months"
@@ -61,5 +61,12 @@
              ]
   , examples (DurationData 2 Year)
              [ "2 years"
+             ]
+  , examples (DurationData 27 Month)
+             [ "2 years and 3 months"
+             , "2 years, 3 months"
+             ]
+  , examples (DurationData 31719604 Second)
+             [ "1 year, 2 days, 3 hours and 4 seconds"
              ]
   ]
diff --git a/Duckling/Duration/EN/Rules.hs b/Duckling/Duration/EN/Rules.hs
--- a/Duckling/Duration/EN/Rules.hs
+++ b/Duckling/Duration/EN/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
 
@@ -14,16 +15,19 @@
   ( rules
   ) where
 
+import Data.Semigroup ((<>))
 import Data.String
 import Prelude
 import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Duration.Helpers
+import Duckling.Duration.Types (DurationData(..))
 import Duckling.Numeral.Helpers (parseInt, parseInteger)
 import Duckling.Numeral.Types (NumeralData(..))
 import Duckling.Regex.Types
 import Duckling.Types
+import qualified Duckling.Duration.Types as TDuration
 import qualified Duckling.Numeral.Types as TNumeral
 import qualified Duckling.TimeGrain.Types as TG
 
@@ -70,7 +74,7 @@
     [ Predicate isNatural
     , regex "(['\"])"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:
        Token RegexMatch (GroupMatch (x:_)):
        _) -> case x of
@@ -88,7 +92,7 @@
     , regex "more|less"
     , dimension TimeGrain
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral nd:_:Token TimeGrain grain:_) ->
         Just . Token Duration . duration grain . floor $ TNumeral.value nd
       _ -> Nothing
@@ -100,7 +104,7 @@
   , pattern =
     [ regex "(\\d+)\\.(\\d+) *hours?"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (h:m:_)):_) -> do
         hh <- parseInteger h
         mnum <- parseInteger m
@@ -116,7 +120,7 @@
     [ Predicate isNatural
     , regex "and (an? )?half hours?"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:_) ->
         Just . Token Duration . duration TG.Minute $ 30 + 60 * floor v
       _ -> Nothing
@@ -129,7 +133,7 @@
     [ regex "an?"
     , dimension TimeGrain
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (_:Token TimeGrain grain:_) -> Just . Token Duration $ duration grain 1
       _ -> Nothing
   }
@@ -141,11 +145,29 @@
     [ regex "(about|around|approximately|exactly)"
     , dimension Duration
     ]
-    , prod = \tokens -> case tokens of
+    , prod = \case
         (_:token:_) -> Just token
         _ -> Nothing
   }
 
+ruleCompositeDuration :: Rule
+ruleCompositeDuration = Rule
+  { name = "composite <duration>"
+  , pattern =
+    [ Predicate isNatural
+    , dimension TimeGrain
+    , regex ",|and"
+    , dimension Duration
+    ]
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v}:
+       Token TimeGrain g:
+       _:
+       Token Duration dd@DurationData{TDuration.grain = dg}:
+       _) | g > dg -> Just . Token Duration $ duration g (floor v) <> dd
+      _ -> Nothing
+  }
+
 rules :: [Rule]
 rules =
   [ ruleDurationQuarterOfAnHour
@@ -158,4 +180,5 @@
   , ruleDurationA
   , ruleDurationPrecision
   , ruleNumeralQuotes
+  , ruleCompositeDuration
   ]
diff --git a/Duckling/Duration/FR/Corpus.hs b/Duckling/Duration/FR/Corpus.hs
--- a/Duckling/Duration/FR/Corpus.hs
+++ b/Duckling/Duration/FR/Corpus.hs
@@ -23,10 +23,10 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale FR Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale FR Nothing}, testOptions, examples)
   where
     examples =
       [ "les jours"
diff --git a/Duckling/Duration/GA/Corpus.hs b/Duckling/Duration/GA/Corpus.hs
--- a/Duckling/Duration/GA/Corpus.hs
+++ b/Duckling/Duration/GA/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/HU/Corpus.hs b/Duckling/Duration/HU/Corpus.hs
--- a/Duckling/Duration/HU/Corpus.hs
+++ b/Duckling/Duration/HU/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HU Nothing}, testOptions, allExamples)
 
 
 allExamples :: [Example]
diff --git a/Duckling/Duration/JA/Corpus.hs b/Duckling/Duration/JA/Corpus.hs
--- a/Duckling/Duration/JA/Corpus.hs
+++ b/Duckling/Duration/JA/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale JA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/KO/Corpus.hs b/Duckling/Duration/KO/Corpus.hs
--- a/Duckling/Duration/KO/Corpus.hs
+++ b/Duckling/Duration/KO/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/NB/Corpus.hs b/Duckling/Duration/NB/Corpus.hs
--- a/Duckling/Duration/NB/Corpus.hs
+++ b/Duckling/Duration/NB/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/NL/Corpus.hs b/Duckling/Duration/NL/Corpus.hs
--- a/Duckling/Duration/NL/Corpus.hs
+++ b/Duckling/Duration/NL/Corpus.hs
@@ -23,10 +23,10 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale NL Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale NL Nothing}, testOptions, examples)
   where
     examples =
       [ "voor maanden"
diff --git a/Duckling/Duration/PL/Corpus.hs b/Duckling/Duration/PL/Corpus.hs
--- a/Duckling/Duration/PL/Corpus.hs
+++ b/Duckling/Duration/PL/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/PT/Corpus.hs b/Duckling/Duration/PT/Corpus.hs
--- a/Duckling/Duration/PT/Corpus.hs
+++ b/Duckling/Duration/PT/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/RO/Corpus.hs b/Duckling/Duration/RO/Corpus.hs
--- a/Duckling/Duration/RO/Corpus.hs
+++ b/Duckling/Duration/RO/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/RU/Corpus.hs b/Duckling/Duration/RU/Corpus.hs
--- a/Duckling/Duration/RU/Corpus.hs
+++ b/Duckling/Duration/RU/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/Rules.hs b/Duckling/Duration/Rules.hs
--- a/Duckling/Duration/Rules.hs
+++ b/Duckling/Duration/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Duration.Rules
@@ -29,7 +30,7 @@
     [ Predicate isNatural
     , dimension TimeGrain
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token Numeral NumeralData{TNumeral.value = v}:
        Token TimeGrain grain:
        _) -> Just . Token Duration . duration grain $ floor v
diff --git a/Duckling/Duration/SV/Corpus.hs b/Duckling/Duration/SV/Corpus.hs
--- a/Duckling/Duration/SV/Corpus.hs
+++ b/Duckling/Duration/SV/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale SV Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/TR/Corpus.hs b/Duckling/Duration/TR/Corpus.hs
--- a/Duckling/Duration/TR/Corpus.hs
+++ b/Duckling/Duration/TR/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain (..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Duration/Types.hs b/Duckling/Duration/Types.hs
--- a/Duckling/Duration/Types.hs
+++ b/Duckling/Duration/Types.hs
@@ -18,7 +18,9 @@
 import Control.DeepSeq
 import Data.Aeson
 import Data.Hashable
+import Data.Semigroup
 import Data.Text (Text)
+import Data.Tuple.Extra (both)
 import GHC.Generics
 import TextShow (showt)
 import Prelude
@@ -34,8 +36,14 @@
 
 instance Resolve DurationData where
   type ResolvedValue DurationData = DurationData
-  resolve _ x = Just x
+  resolve _ _ x = Just (x, False)
 
+instance Semigroup DurationData where
+  d1@(DurationData _ g1) <> d2@(DurationData _ g2) = DurationData (v1+v2) g
+    where
+    g = g1 `min` g2
+    (DurationData v1 _, DurationData v2 _) = both (withGrain g) (d1,d2)
+
 instance ToJSON DurationData where
   toJSON DurationData {value, grain} = object
     [ "type"       .= ("value" :: Text)
@@ -47,3 +55,12 @@
       , "value" .= inSeconds grain value
       ]
     ]
+
+-- | Convert a duration to the given grain, rounded to the
+-- nearest integer. For example, 1 month is converted to 4 weeks.
+withGrain :: Grain -> DurationData -> DurationData
+withGrain g d@(DurationData v1 g1)
+  | g == g1 = d
+  | otherwise = DurationData v g
+      where
+      v = round $ inSeconds g1 (fromIntegral v1 :: Double) / inSeconds g 1
diff --git a/Duckling/Duration/ZH/Corpus.hs b/Duckling/Duration/ZH/Corpus.hs
--- a/Duckling/Duration/ZH/Corpus.hs
+++ b/Duckling/Duration/ZH/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types (Grain(..))
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Email/Corpus.hs b/Duckling/Email/Corpus.hs
--- a/Duckling/Email/Corpus.hs
+++ b/Duckling/Email/Corpus.hs
@@ -20,10 +20,10 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "hey@6"
diff --git a/Duckling/Email/EN/Corpus.hs b/Duckling/Email/EN/Corpus.hs
--- a/Duckling/Email/EN/Corpus.hs
+++ b/Duckling/Email/EN/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "fitness at 6.40"
@@ -35,7 +35,7 @@
       ]
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Email/FR/Corpus.hs b/Duckling/Email/FR/Corpus.hs
--- a/Duckling/Email/FR/Corpus.hs
+++ b/Duckling/Email/FR/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Email/IT/Corpus.hs b/Duckling/Email/IT/Corpus.hs
--- a/Duckling/Email/IT/Corpus.hs
+++ b/Duckling/Email/IT/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Email/Types.hs b/Duckling/Email/Types.hs
--- a/Duckling/Email/Types.hs
+++ b/Duckling/Email/Types.hs
@@ -29,7 +29,7 @@
 
 instance Resolve EmailData where
   type ResolvedValue EmailData = EmailData
-  resolve _ x = Just x
+  resolve _ _ x = Just (x, False)
 
 instance ToJSON EmailData where
   toJSON EmailData {value} = object [ "value" .= value ]
diff --git a/Duckling/Engine.hs b/Duckling/Engine.hs
--- a/Duckling/Engine.hs
+++ b/Duckling/Engine.hs
@@ -19,7 +19,7 @@
 
 import Control.DeepSeq
 import Control.Monad.Extra
-import Data.Aeson
+import Data.Aeson (toJSON)
 import Data.ByteString (ByteString)
 import Data.Functor.Identity
 import Data.Maybe
@@ -48,10 +48,10 @@
 runDuckling :: Duckling a -> a
 runDuckling ma = runIdentity ma
 
-parseAndResolve :: [Rule] -> Text -> Context -> [ResolvedToken]
-parseAndResolve rules input context = mapMaybe (resolveNode context) .
-  force $ Stash.toPosOrderedList $ runDuckling $
-  parseString rules (Document.fromText input)
+parseAndResolve :: [Rule] -> Text -> Context -> Options -> [ResolvedToken]
+parseAndResolve rules input context options =
+  mapMaybe (resolveNode context options) . force $ Stash.toPosOrderedList $
+  runDuckling $ parseString rules (Document.fromText input)
 
 produce :: Match -> Maybe Node
 produce (_, _, []) = Nothing
@@ -218,11 +218,13 @@
   headPredicateRules =
     [ rule | rule@Rule{pattern = (Predicate _ : _)} <- rules ]
 
-resolveNode :: Context -> Node -> Maybe ResolvedToken
-resolveNode context n@Node{token = (Token _ dd), nodeRange = nodeRange} = do
-  val <- resolve context dd
+resolveNode :: Context -> Options -> Node -> Maybe ResolvedToken
+resolveNode context options n@Node{token = (Token _ dd), nodeRange = nodeRange}
+  = do
+  (val, latent) <- resolve context options dd
   Just Resolved
     { range = nodeRange
     , node = n
     , jsonValue = toJSON val
+    , isLatent = latent
     }
diff --git a/Duckling/Locale.hs b/Duckling/Locale.hs
--- a/Duckling/Locale.hs
+++ b/Duckling/Locale.hs
@@ -60,6 +60,7 @@
   | RO
   | RU
   | SV
+  | TA
   | TR
   | UK
   | VI
diff --git a/Duckling/Numeral/AR/Corpus.hs b/Duckling/Numeral/AR/Corpus.hs
--- a/Duckling/Numeral/AR/Corpus.hs
+++ b/Duckling/Numeral/AR/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/AR/Rules.hs b/Duckling/Numeral/AR/Rules.hs
--- a/Duckling/Numeral/AR/Rules.hs
+++ b/Duckling/Numeral/AR/Rules.hs
@@ -310,7 +310,7 @@
   , pattern =
     [ dimension Numeral
     , regex "فاصل[ةه]"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
diff --git a/Duckling/Numeral/BG/Corpus.hs b/Duckling/Numeral/BG/Corpus.hs
--- a/Duckling/Numeral/BG/Corpus.hs
+++ b/Duckling/Numeral/BG/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale BG Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale BG Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/BG/Rules.hs b/Duckling/Numeral/BG/Rules.hs
--- a/Duckling/Numeral/BG/Rules.hs
+++ b/Duckling/Numeral/BG/Rules.hs
@@ -16,7 +16,6 @@
 
 import Data.HashMap.Strict (HashMap)
 import Data.Maybe
-import Data.String
 import Data.Text (Text)
 import Prelude
 import qualified Data.HashMap.Strict as HashMap
@@ -164,7 +163,7 @@
   , pattern =
     [ dimension Numeral
     , regex "цяло и"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/CS/Corpus.hs b/Duckling/Numeral/CS/Corpus.hs
--- a/Duckling/Numeral/CS/Corpus.hs
+++ b/Duckling/Numeral/CS/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale CS Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale CS Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/DA/Corpus.hs b/Duckling/Numeral/DA/Corpus.hs
--- a/Duckling/Numeral/DA/Corpus.hs
+++ b/Duckling/Numeral/DA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale DA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale DA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/DA/Rules.hs b/Duckling/Numeral/DA/Rules.hs
--- a/Duckling/Numeral/DA/Rules.hs
+++ b/Duckling/Numeral/DA/Rules.hs
@@ -110,7 +110,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -269,7 +269,7 @@
   , pattern =
     [ dimension Numeral
     , regex "komma"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
diff --git a/Duckling/Numeral/DE/Corpus.hs b/Duckling/Numeral/DE/Corpus.hs
--- a/Duckling/Numeral/DE/Corpus.hs
+++ b/Duckling/Numeral/DE/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale DE Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale DE Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/DE/Rules.hs b/Duckling/Numeral/DE/Rules.hs
--- a/Duckling/Numeral/DE/Rules.hs
+++ b/Duckling/Numeral/DE/Rules.hs
@@ -151,7 +151,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -294,7 +294,7 @@
   , pattern =
     [ dimension Numeral
     , regex "komma"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
diff --git a/Duckling/Numeral/EL/Corpus.hs b/Duckling/Numeral/EL/Corpus.hs
--- a/Duckling/Numeral/EL/Corpus.hs
+++ b/Duckling/Numeral/EL/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale EL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale EL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/EL/Rules.hs b/Duckling/Numeral/EL/Rules.hs
--- a/Duckling/Numeral/EL/Rules.hs
+++ b/Duckling/Numeral/EL/Rules.hs
@@ -190,7 +190,7 @@
 ruleSum = Rule
   { name = "intersect 2 numbers"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -230,7 +230,7 @@
   , pattern =
     [ dimension Numeral
     , regex "κόμμα"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/EN/Corpus.hs b/Duckling/Numeral/EN/Corpus.hs
--- a/Duckling/Numeral/EN/Corpus.hs
+++ b/Duckling/Numeral/EN/Corpus.hs
@@ -18,7 +18,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -126,6 +126,10 @@
   , examples (NumeralValue 5000)
              [ "5 thousand"
              , "five thousand"
+             ]
+  , examples (NumeralValue (-504))
+             [ "-504"
+             , "negative five hundred and four"
              ]
   , examples (NumeralValue (-1.2e6))
              [ "- 1,200,000"
diff --git a/Duckling/Numeral/EN/Rules.hs b/Duckling/Numeral/EN/Rules.hs
--- a/Duckling/Numeral/EN/Rules.hs
+++ b/Duckling/Numeral/EN/Rules.hs
@@ -205,7 +205,7 @@
   , pattern =
     [ dimension Numeral
     , regex "point|dot"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
@@ -218,7 +218,7 @@
   { name = "point 77"
   , pattern =
     [ regex "point|dot"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (_:Token Numeral nd:_) -> double . decimalsToDouble $ TNumeral.value nd
@@ -282,7 +282,7 @@
 ruleSum = Rule
   { name = "intersect 2 numbers"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate $ and . sequence [hasGrain, isPositive]
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -296,7 +296,7 @@
 ruleSumAnd = Rule
   { name = "intersect 2 numbers (with and)"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate $ and . sequence [hasGrain, isPositive]
     , regex "and"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
diff --git a/Duckling/Numeral/ES/Corpus.hs b/Duckling/Numeral/ES/Corpus.hs
--- a/Duckling/Numeral/ES/Corpus.hs
+++ b/Duckling/Numeral/ES/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/ES/Rules.hs b/Duckling/Numeral/ES/Rules.hs
--- a/Duckling/Numeral/ES/Rules.hs
+++ b/Duckling/Numeral/ES/Rules.hs
@@ -260,7 +260,7 @@
   , pattern =
     [ dimension Numeral
     , regex "punto"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
diff --git a/Duckling/Numeral/ET/Corpus.hs b/Duckling/Numeral/ET/Corpus.hs
--- a/Duckling/Numeral/ET/Corpus.hs
+++ b/Duckling/Numeral/ET/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ET Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ET Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/ET/Rules.hs b/Duckling/Numeral/ET/Rules.hs
--- a/Duckling/Numeral/ET/Rules.hs
+++ b/Duckling/Numeral/ET/Rules.hs
@@ -121,7 +121,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -247,7 +247,7 @@
   , pattern =
     [ dimension Numeral
     , regex "dot|point"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
diff --git a/Duckling/Numeral/FR/Corpus.hs b/Duckling/Numeral/FR/Corpus.hs
--- a/Duckling/Numeral/FR/Corpus.hs
+++ b/Duckling/Numeral/FR/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/FR/Rules.hs b/Duckling/Numeral/FR/Rules.hs
--- a/Duckling/Numeral/FR/Rules.hs
+++ b/Duckling/Numeral/FR/Rules.hs
@@ -270,7 +270,7 @@
 ruleSum = Rule
   { name = "intersect 2 numbers"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/GA/Corpus.hs b/Duckling/Numeral/GA/Corpus.hs
--- a/Duckling/Numeral/GA/Corpus.hs
+++ b/Duckling/Numeral/GA/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/HE/Corpus.hs b/Duckling/Numeral/HE/Corpus.hs
--- a/Duckling/Numeral/HE/Corpus.hs
+++ b/Duckling/Numeral/HE/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HE Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HE Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/HE/Rules.hs b/Duckling/Numeral/HE/Rules.hs
--- a/Duckling/Numeral/HE/Rules.hs
+++ b/Duckling/Numeral/HE/Rules.hs
@@ -38,7 +38,7 @@
 ruleIntersectNumerals = Rule
   { name = "intersect numbers"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -52,7 +52,7 @@
 ruleIntersectWithAnd = Rule
   { name = "intersect (with and)"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , regex "ו"
     , Predicate isMultipliable
     ]
@@ -324,7 +324,7 @@
   , pattern =
     [ dimension Numeral
     , regex "נקודה"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/HI/Corpus.hs b/Duckling/Numeral/HI/Corpus.hs
--- a/Duckling/Numeral/HI/Corpus.hs
+++ b/Duckling/Numeral/HI/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HI Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HI Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/HR/Corpus.hs b/Duckling/Numeral/HR/Corpus.hs
--- a/Duckling/Numeral/HR/Corpus.hs
+++ b/Duckling/Numeral/HR/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/HR/Rules.hs b/Duckling/Numeral/HR/Rules.hs
--- a/Duckling/Numeral/HR/Rules.hs
+++ b/Duckling/Numeral/HR/Rules.hs
@@ -158,7 +158,7 @@
 ruleSum = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -309,7 +309,7 @@
   , pattern =
     [ dimension Numeral
     , regex "cijela|to(c|č)ka|zarez"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
diff --git a/Duckling/Numeral/HU/Corpus.hs b/Duckling/Numeral/HU/Corpus.hs
--- a/Duckling/Numeral/HU/Corpus.hs
+++ b/Duckling/Numeral/HU/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/Helpers.hs b/Duckling/Numeral/Helpers.hs
--- a/Duckling/Numeral/Helpers.hs
+++ b/Duckling/Numeral/Helpers.hs
@@ -11,12 +11,14 @@
 
 module Duckling.Numeral.Helpers
   ( decimalsToDouble
+  , diffIntegerDigits
   , double
   , integer
   , multiply
   , isMultipliable
   , isNatural
   , isPositive
+  , hasGrain
   , divide
   , notOkForAnyTime
   , numberBetween
@@ -79,6 +81,18 @@
       [] -> 0
       (multiplier : _) -> x / multiplier
 
+-- diffIntegerDigits a b = # of digits in a - # of digits in b
+-- ignores the nondecimal components
+diffIntegerDigits :: Double -> Double -> Int
+diffIntegerDigits a b = digitsOf a - digitsOf b
+  where
+    digitsOf :: Double -> Int
+    digitsOf = digitsOfInt . floor . abs
+
+    digitsOfInt :: Int -> Int
+    digitsOfInt 0 = 0
+    digitsOfInt a = 1 + digitsOfInt (a `div` 10)
+
 -- -----------------------------------------------------------------
 -- Patterns
 
@@ -107,6 +121,10 @@
 isMultipliable :: Predicate
 isMultipliable (Token Numeral nd) = multipliable nd
 isMultipliable _ = False
+
+hasGrain :: Predicate
+hasGrain (Token Numeral NumeralData {grain = Just g}) = g > 1
+hasGrain _ = False
 
 oneOf :: [Double] -> PatternItem
 oneOf vs = Predicate $ \x ->
diff --git a/Duckling/Numeral/ID/Corpus.hs b/Duckling/Numeral/ID/Corpus.hs
--- a/Duckling/Numeral/ID/Corpus.hs
+++ b/Duckling/Numeral/ID/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ID Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ID Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/ID/Rules.hs b/Duckling/Numeral/ID/Rules.hs
--- a/Duckling/Numeral/ID/Rules.hs
+++ b/Duckling/Numeral/ID/Rules.hs
@@ -62,7 +62,7 @@
   , pattern =
     [ dimension Numeral
     , regex "koma"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
@@ -146,7 +146,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/IT/Corpus.hs b/Duckling/Numeral/IT/Corpus.hs
--- a/Duckling/Numeral/IT/Corpus.hs
+++ b/Duckling/Numeral/IT/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/JA/Corpus.hs b/Duckling/Numeral/JA/Corpus.hs
--- a/Duckling/Numeral/JA/Corpus.hs
+++ b/Duckling/Numeral/JA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale JA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/KA/Corpus.hs b/Duckling/Numeral/KA/Corpus.hs
--- a/Duckling/Numeral/KA/Corpus.hs
+++ b/Duckling/Numeral/KA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/KO/Corpus.hs b/Duckling/Numeral/KO/Corpus.hs
--- a/Duckling/Numeral/KO/Corpus.hs
+++ b/Duckling/Numeral/KO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/KO/Rules.hs b/Duckling/Numeral/KO/Rules.hs
--- a/Duckling/Numeral/KO/Rules.hs
+++ b/Duckling/Numeral/KO/Rules.hs
@@ -206,7 +206,7 @@
 ruleSum = Rule
   { name = "intersect 2 numbers"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/MY/Corpus.hs b/Duckling/Numeral/MY/Corpus.hs
--- a/Duckling/Numeral/MY/Corpus.hs
+++ b/Duckling/Numeral/MY/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale MY Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale MY Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/NB/Corpus.hs b/Duckling/Numeral/NB/Corpus.hs
--- a/Duckling/Numeral/NB/Corpus.hs
+++ b/Duckling/Numeral/NB/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/NB/Rules.hs b/Duckling/Numeral/NB/Rules.hs
--- a/Duckling/Numeral/NB/Rules.hs
+++ b/Duckling/Numeral/NB/Rules.hs
@@ -32,7 +32,7 @@
 ruleIntersectWithAnd = Rule
   { name = "intersect (with and)"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , regex "og"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
@@ -129,7 +129,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -268,7 +268,7 @@
   , pattern =
     [ dimension Numeral
     , regex "komma"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/NE/Corpus.hs b/Duckling/Numeral/NE/Corpus.hs
--- a/Duckling/Numeral/NE/Corpus.hs
+++ b/Duckling/Numeral/NE/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NE Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NE Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/NL/Corpus.hs b/Duckling/Numeral/NL/Corpus.hs
--- a/Duckling/Numeral/NL/Corpus.hs
+++ b/Duckling/Numeral/NL/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/NL/Rules.hs b/Duckling/Numeral/NL/Rules.hs
--- a/Duckling/Numeral/NL/Rules.hs
+++ b/Duckling/Numeral/NL/Rules.hs
@@ -115,7 +115,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
diff --git a/Duckling/Numeral/PL/Corpus.hs b/Duckling/Numeral/PL/Corpus.hs
--- a/Duckling/Numeral/PL/Corpus.hs
+++ b/Duckling/Numeral/PL/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/PL/Rules.hs b/Duckling/Numeral/PL/Rules.hs
--- a/Duckling/Numeral/PL/Rules.hs
+++ b/Duckling/Numeral/PL/Rules.hs
@@ -65,7 +65,7 @@
 ruleIntersectWithAnd = Rule
   { name = "intersect (with and)"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , regex "i|a"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
@@ -328,7 +328,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -514,7 +514,7 @@
   , pattern =
     [ dimension Numeral
     , regex "dot|point"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/PT/Corpus.hs b/Duckling/Numeral/PT/Corpus.hs
--- a/Duckling/Numeral/PT/Corpus.hs
+++ b/Duckling/Numeral/PT/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/PT/Rules.hs b/Duckling/Numeral/PT/Rules.hs
--- a/Duckling/Numeral/PT/Rules.hs
+++ b/Duckling/Numeral/PT/Rules.hs
@@ -249,7 +249,7 @@
   , pattern =
     [ dimension Numeral
     , regex "ponto"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
@@ -262,7 +262,7 @@
   { name = "point 77"
   , pattern =
     [ regex "ponto"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (_:Token Numeral nd:_) -> double . decimalsToDouble $ TNumeral.value nd
@@ -326,7 +326,7 @@
 ruleSum = Rule
   { name = "intersect 2 numbers"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -340,7 +340,7 @@
 ruleSumAnd = Rule
   { name = "intersect 2 numbers (with and)"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , regex "e"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
diff --git a/Duckling/Numeral/RO/Corpus.hs b/Duckling/Numeral/RO/Corpus.hs
--- a/Duckling/Numeral/RO/Corpus.hs
+++ b/Duckling/Numeral/RO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/RO/Rules.hs b/Duckling/Numeral/RO/Rules.hs
--- a/Duckling/Numeral/RO/Rules.hs
+++ b/Duckling/Numeral/RO/Rules.hs
@@ -109,7 +109,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -123,7 +123,7 @@
 ruleIntersectCuI = Rule
   { name = "intersect (cu și)"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , regex "(s|ș)i"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
diff --git a/Duckling/Numeral/RU/Corpus.hs b/Duckling/Numeral/RU/Corpus.hs
--- a/Duckling/Numeral/RU/Corpus.hs
+++ b/Duckling/Numeral/RU/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/RU/Rules.hs b/Duckling/Numeral/RU/Rules.hs
--- a/Duckling/Numeral/RU/Rules.hs
+++ b/Duckling/Numeral/RU/Rules.hs
@@ -248,7 +248,7 @@
   , pattern =
     [ dimension Numeral
     , regex "точка"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/SV/Corpus.hs b/Duckling/Numeral/SV/Corpus.hs
--- a/Duckling/Numeral/SV/Corpus.hs
+++ b/Duckling/Numeral/SV/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale SV Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/SV/Rules.hs b/Duckling/Numeral/SV/Rules.hs
--- a/Duckling/Numeral/SV/Rules.hs
+++ b/Duckling/Numeral/SV/Rules.hs
@@ -32,7 +32,7 @@
 ruleIntersectWithAnd = Rule
   { name = "intersect (with and)"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , regex "och"
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
@@ -119,7 +119,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -264,7 +264,7 @@
   , pattern =
     [ dimension Numeral
     , regex "komma"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/TA/Corpus.hs b/Duckling/Numeral/TA/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/TA/Corpus.hs
@@ -0,0 +1,88 @@
+-- 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.TA.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 TA Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (NumeralValue 0)
+             [ "பூஜ்ஜியம்"
+             ]
+  , examples (NumeralValue 1)
+             [ "ஒன்று"
+             ]
+  , examples (NumeralValue 2)
+             [ "இரண்டு"
+             ]
+  , examples (NumeralValue 3)
+             [ "மூன்று"
+             ]
+  , examples (NumeralValue 4)
+             [ "நான்கு"
+             ]
+  , examples (NumeralValue 5)
+             [ "ஐந்து"
+             ]
+  , examples (NumeralValue 6)
+             [ "ஆறு"
+             ]
+  , examples (NumeralValue 7)
+             [ "ஏழு"
+             ]
+  , examples (NumeralValue 8)
+             [ "எட்டு"
+             ]
+  , examples (NumeralValue 9)
+             [ "ஒன்பது"
+             ]
+  , examples (NumeralValue 10)
+             [ "பத்து"
+             ]
+  , examples (NumeralValue 11)
+             [ "பதினொன்று"
+             ]
+  , examples (NumeralValue 12)
+             [ "பன்னிரண்டு"
+             ]
+  , examples (NumeralValue 20)
+             [ "இருபது"
+             ]
+  , examples (NumeralValue 21)
+             [ "இருபத்திஒன்று"
+             ]
+  , examples (NumeralValue 22)
+             [ "இருபத்திஇரண்டு"
+             ]
+  , examples (NumeralValue 26)
+             [ "இருபத்திஆறு"
+             ]
+  , examples (NumeralValue 30)
+             [ "முப்பது"
+             ]
+   , examples (NumeralValue 33)
+             [ "முப்பத்துமூன்று"
+             ]
+  , examples (NumeralValue 50)
+             [ "ஐம்பது"
+             ]
+  ]
diff --git a/Duckling/Numeral/TA/Rules.hs b/Duckling/Numeral/TA/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Numeral/TA/Rules.hs
@@ -0,0 +1,137 @@
+-- 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 #-}
+{-# LANGUAGE LambdaCase #-}
+
+module Duckling.Numeral.TA.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
+
+zeroToNineMap :: HashMap Text Integer
+zeroToNineMap = HashMap.fromList
+  [ ( "பூஜ்ஜியம்", 0 )
+  , ( "ஒன்று", 1 )
+  , ( "இரண்டு", 2 )
+  , ( "மூன்று", 3 )
+  , ( "நான்கு", 4 )
+  , ( "ஐந்து", 5 )
+  , ( "ஆறு", 6 )
+  , ( "ஏழு", 7 )
+  , ( "எட்டு", 8 )
+  , ( "ஒன்பது", 9 )
+  ]
+
+ruleZeroToNine :: Rule
+ruleZeroToNine = Rule
+  { name = "integer (0..9)"
+  , pattern =
+    [ regex "(பூஜ்ஜியம்|ஒன்று|இரண்டு|மூன்று|நான்கு|ஐந்து|ஆறு|ஏழு|எட்டு|ஒன்பது)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) zeroToNineMap >>= integer
+      _ -> Nothing
+  }
+
+tenToNineteenMap :: HashMap Text Integer
+tenToNineteenMap = HashMap.fromList
+  [ ( "பத்து", 10 )
+  , ( "பதினொன்று", 11 )
+  , ( "பன்னிரண்டு", 12 )
+  , ( "பதின்மூன்று", 13 )
+  , ( "பதினான்கு", 14 )
+  , ( "பதினைந்து", 15 )
+  , ( "பதினாறு", 16 )
+  , ( "பதினேழு", 17 )
+  , ( "பதினெட்டு", 18 )
+  , ( "பத்தொன்பது", 19 )
+  ]
+
+ruleTenToNineteen :: Rule
+ruleTenToNineteen = Rule
+  { name = "integer (10..19)"
+  , pattern =
+    [ regex "(பத்து|பதினொன்று|பன்னிரண்டு|பதின்மூன்று|பதினான்கு|பதினைந்து|பதினாறு|பதினேழு|பதினெட்டு|பத்தொன்பது)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tenToNineteenMap >>= integer
+      _ -> Nothing
+  }
+
+tensMap :: HashMap Text Integer
+tensMap = HashMap.fromList
+  [ ( "இருபது", 20 )
+  , ( "இருபத்தி", 20 )
+  , ( "முப்பது", 30 )
+  , ( "முப்பத்து", 30 )
+  , ( "நாற்பது", 40 )
+  , ( "நாற்பத்து", 40 )
+  , ( "ஐம்பது", 50 )
+  , ( "ஐம்பத்தி", 50 )
+  , ( "அறுபது", 60 )
+  , ( "அறுபத்", 60 )
+  , ( "எழுபது", 70 )
+  , ( "எழுபத்தி", 70 )
+  , ( "எண்பது", 80 )
+  , ( "எண்பத்", 80 )
+  , ( "தொண்ணூறு", 90 )
+  , ( "தொண்ணுற்று", 90 )
+  ]
+
+ruleTens :: Rule
+ruleTens = Rule
+  { name = "integer (20..90)"
+  , pattern =
+    [ regex "(இருபது|முப்பது|நாற்பது|ஐம்பது|அறுபது|எழுபது|எண்பது|தொண்ணூறு)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        HashMap.lookup (Text.toLower match) tensMap >>= integer
+      _ -> Nothing
+  }
+
+ruleCompositeTens :: Rule
+ruleCompositeTens = Rule
+  { name = "integer ([2-9][1-9])"
+  , pattern =
+    [ regex "(இருபத்தி|முப்பத்து|நாற்பத்து|ஐம்பத்தி|அறுபத்|எழுபத்தி|எண்பத்|தொண்ணுற்று)(ஒன்று|இரண்டு|மூன்று|நான்கு|ஐந்து|ஆறு|ஏழு|எட்டு|ஒன்பது)"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (m1:m2:_)):_) -> do
+        v1 <- HashMap.lookup (Text.toLower m1) tensMap
+        v2 <- HashMap.lookup (Text.toLower m2) zeroToNineMap
+        integer $ v1 + v2
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleZeroToNine
+  , ruleTenToNineteen
+  , ruleTens
+  , ruleCompositeTens
+  ]
diff --git a/Duckling/Numeral/TR/Corpus.hs b/Duckling/Numeral/TR/Corpus.hs
--- a/Duckling/Numeral/TR/Corpus.hs
+++ b/Duckling/Numeral/TR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/TR/Rules.hs b/Duckling/Numeral/TR/Rules.hs
--- a/Duckling/Numeral/TR/Rules.hs
+++ b/Duckling/Numeral/TR/Rules.hs
@@ -305,7 +305,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -666,7 +666,7 @@
   , pattern =
     [ dimension Numeral
     , regex "nokta|virgül"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral NumeralData{TNumeral.value = v1}:
diff --git a/Duckling/Numeral/Types.hs b/Duckling/Numeral/Types.hs
--- a/Duckling/Numeral/Types.hs
+++ b/Duckling/Numeral/Types.hs
@@ -39,7 +39,7 @@
 
 instance Resolve NumeralData where
   type ResolvedValue NumeralData = NumeralValue
-  resolve _ NumeralData {value} = Just NumeralValue {vValue = value}
+  resolve _ _ NumeralData {value} = Just (NumeralValue {vValue = value}, False)
 
 newtype NumeralValue = NumeralValue { vValue :: Double }
   deriving (Eq, Show)
diff --git a/Duckling/Numeral/UK/Corpus.hs b/Duckling/Numeral/UK/Corpus.hs
--- a/Duckling/Numeral/UK/Corpus.hs
+++ b/Duckling/Numeral/UK/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale UK Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale UK Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Numeral/UK/Rules.hs b/Duckling/Numeral/UK/Rules.hs
--- a/Duckling/Numeral/UK/Rules.hs
+++ b/Duckling/Numeral/UK/Rules.hs
@@ -225,7 +225,7 @@
   , pattern =
     [ dimension Numeral
     , regex "крапка"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
diff --git a/Duckling/Numeral/VI/Corpus.hs b/Duckling/Numeral/VI/Corpus.hs
--- a/Duckling/Numeral/VI/Corpus.hs
+++ b/Duckling/Numeral/VI/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale VI Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale VI Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -61,16 +61,16 @@
             , "tră"
             ]
   , examples (NumeralValue 1.1)
-             [ "1.1"
-             , "1.10"
-             , "01.10"
+             [ "1,1"
+             , "1,10"
+             , "01,10"
              ]
   , examples (NumeralValue 0.77)
-             [ "0.77"
-             , ".77"
+             [ "0,77"
+             , ",77"
              ]
   , examples (NumeralValue 100000)
-             [ "100,000"
+             [ "100.000"
              , "100000"
              , "100K"
              , "100k"
@@ -79,22 +79,22 @@
              [ "3M"
              , "3000K"
              , "3000000"
-             , "3,000,000"
+             , "3.000.000"
              ]
   , examples (NumeralValue 1200000)
-             [ "1,200,000"
+             [ "1.200.000"
              , "1200000"
-             , "1.2M"
+             , "1,2M"
              , "1200K"
-             , ".0012G"
+             , ",0012G"
              ]
   , examples (NumeralValue (-1200000))
-             [ "- 1,200,000"
+             [ "- 1.200.000"
              , "-1200000"
-             , "âm 1,200,000"
-             , "-1.2M"
+             , "âm 1.200.000"
+             , "-1,2M"
              , "-1200K"
-             , "-.0012G"
+             , "-,0012G"
              ]
   , examples (NumeralValue 5000)
              [ "5 nghìn"
diff --git a/Duckling/Numeral/VI/Rules.hs b/Duckling/Numeral/VI/Rules.hs
--- a/Duckling/Numeral/VI/Rules.hs
+++ b/Duckling/Numeral/VI/Rules.hs
@@ -79,11 +79,11 @@
 ruleDecimalWithThousandsSeparator = Rule
   { name = "decimal with thousands separator"
   , pattern =
-    [ regex "(\\d+(,\\d\\d\\d)+\\.\\d+)"
+    [ regex "(\\d+(\\.\\d\\d\\d)+,\\d+)"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):_) ->
-        parseDouble (Text.replace "," Text.empty match) >>= double
+        parseDouble (Text.replace "." Text.empty match) >>= double
       _ -> Nothing
   }
 
@@ -91,10 +91,10 @@
 ruleDecimalNumeral = Rule
   { name = "decimal number"
   , pattern =
-    [ regex "(\\d*\\.\\d+)"
+    [ regex "(\\d*,\\d+)"
     ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal True match
+      (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal False match
       _ -> Nothing
   }
 
@@ -118,7 +118,7 @@
   , pattern =
     [ dimension Numeral
     , regex "chấm|phẩy"
-    , numberWith TNumeral.grain isNothing
+    , Predicate $ not . hasGrain
     ]
   , prod = \tokens -> case tokens of
       (Token Numeral nd1:_:Token Numeral nd2:_) ->
@@ -130,7 +130,7 @@
 ruleIntersect = Rule
   { name = "intersect"
   , pattern =
-    [ numberWith (fromMaybe 0 . TNumeral.grain) (>1)
+    [ Predicate hasGrain
     , Predicate $ and . sequence [not . isMultipliable, isPositive]
     ]
   , prod = \tokens -> case tokens of
@@ -275,11 +275,11 @@
 ruleIntegerWithThousandsSeparator = Rule
   { name = "integer with thousands separator ,"
   , pattern =
-    [ regex "(\\d{1,3}(,\\d\\d\\d){1,5})"
+    [ regex "(\\d{1,3}(\\.\\d\\d\\d){1,5})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (match:_)):
-       _) -> let fmt = Text.replace "," Text.empty match
+       _) -> let fmt = Text.replace "." Text.empty match
         in parseDouble fmt >>= double
       _ -> Nothing
   }
diff --git a/Duckling/Numeral/ZH/Corpus.hs b/Duckling/Numeral/ZH/Corpus.hs
--- a/Duckling/Numeral/ZH/Corpus.hs
+++ b/Duckling/Numeral/ZH/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -66,6 +66,24 @@
              [ "96"
              , "九十六"
              ]
+  , examples (NumeralValue 203)
+             [ "203"
+             , "二百零三"
+             ]
+  , examples (NumeralValue 534)
+             [ "534"
+             , "五百三十四"
+             ]
+  , examples (NumeralValue 34567)
+             [ "34567"
+             , "34,567"
+             , "三万四千五百六十七"
+             ]
+  , examples (NumeralValue 10040)
+             [ "10040"
+             , "10,040"
+             , "一万零四十"
+             ]
   , examples (NumeralValue 1.1)
              [ "1.1"
              , "1.10"
@@ -75,24 +93,36 @@
              [ "0.77"
              , ".77"
              ]
+  , examples (NumeralValue 34507)
+             [ "34507"
+             , "34,507"
+             , "三万四千五百零七"
+             ]
   , examples (NumeralValue 100000)
              [ "100,000"
              , "100000"
              , "100K"
              , "100k"
+             , "十万"
              ]
   , examples (NumeralValue 3000000)
              [ "3M"
-             , "3000K"
              , "3000000"
              , "3,000,000"
+             , "三百万"
              ]
+  , examples (NumeralValue 1040000)
+             [ "1,040,000"
+             , "1040000"
+             , "1.04M"
+             , "一百零四万"
+             ]
   , examples (NumeralValue 1200000)
              [ "1,200,000"
              , "1200000"
              , "1.2M"
-             , "1200K"
              , ".0012G"
+             , "一百二十万"
              ]
   , examples (NumeralValue (-1200000))
              [ "- 1,200,000"
@@ -105,5 +135,6 @@
              , "-1.2M"
              , "-1200K"
              , "-.0012G"
+             , "负一百二十万"
              ]
   ]
diff --git a/Duckling/Numeral/ZH/Rules.hs b/Duckling/Numeral/ZH/Rules.hs
--- a/Duckling/Numeral/ZH/Rules.hs
+++ b/Duckling/Numeral/ZH/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Numeral.ZH.Rules
@@ -15,6 +16,7 @@
 
 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
@@ -26,19 +28,19 @@
 import Duckling.Types
 import qualified Duckling.Numeral.Types as TNumeral
 
-ruleInteger5 :: Rule
-ruleInteger5 = Rule
+ruleInteger :: Rule
+ruleInteger = Rule
   { name = "integer (0..10)"
   , pattern =
-    [ regex "(〇|零|一|二|两|兩|三|四|五|六|七|八|九|十)(个|個)?"
+    [ regex "(〇|零|一|二|两|兩|三|四|五|六|七|八|九|十)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
         HashMap.lookup match integerMap >>= integer
       _ -> Nothing
   }
 
-integerMap :: HashMap.HashMap Text.Text Integer
+integerMap :: HashMap.HashMap Text Integer
 integerMap = HashMap.fromList
   [ ( "〇", 0 )
   , ( "零", 0 )
@@ -64,7 +66,7 @@
     [ regex "-|负|負"
     , Predicate isPositive
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (_:Token Numeral nd:_) -> double (TNumeral.value nd * (-1))
       _ -> Nothing
   }
@@ -75,7 +77,7 @@
   , pattern =
     [ regex "(\\d+(,\\d\\d\\d)+\\.\\d+)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) ->
         parseDouble (Text.replace "," Text.empty match) >>= double
       _ -> Nothing
@@ -87,102 +89,124 @@
   , pattern =
     [ regex "(\\d*\\.\\d+)"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (Token RegexMatch (GroupMatch (match:_)):_) -> parseDecimal True match
       _ -> Nothing
   }
 
 ruleNumeral :: Rule
 ruleNumeral = Rule
-  { name = "<number>个"
+  { name = "<number>个/個"
   , pattern =
     [ dimension Numeral
-    , regex "个"
+    , regex "个|個"
     ]
-  , prod = \tokens -> case tokens of
+  , prod = \case
       (token:_) -> Just token
       _ -> Nothing
   }
 
-ruleInteger3 :: Rule
-ruleInteger3 = Rule
-  { name = "integer (20..90)"
-  , pattern =
-    [ numberBetween 2 10
-    , regex "十"
-    ]
-  , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ v * 10
-      _ -> Nothing
-  }
+numeralSuffixList :: [(Text, Maybe Token)]
+numeralSuffixList =
+  [ ("K", double 1e3 >>= withGrain 3 >>= withMultipliable)
+  , ("M", double 1e6 >>= withGrain 6 >>= withMultipliable)
+  , ("G", double 1e9 >>= withGrain 9 >>= withMultipliable)
+  , ("十", double 1e1 >>= withGrain 1 >>= withMultipliable)
+  , ("百", double 1e2 >>= withGrain 2 >>= withMultipliable)
+  , ("千", double 1e3 >>= withGrain 3 >>= withMultipliable)
+  , ("万", double 1e4 >>= withGrain 4 >>= withMultipliable)
+  , ("亿", double 1e8 >>= withGrain 8 >>= withMultipliable)
+  ]
 
-ruleNumeralsSuffixesKMG :: Rule
-ruleNumeralsSuffixesKMG = Rule
-  { name = "numbers suffixes (K, M, G)"
+ruleNumeralSuffixes :: [Rule]
+ruleNumeralSuffixes = uncurry constructNumeralSuffixRule <$> numeralSuffixList
+  where
+    constructNumeralSuffixRule :: Text -> Maybe Token -> Rule
+    constructNumeralSuffixRule suffixName production = Rule
+      { name = "number suffix: " `mappend` suffixName
+      , pattern =
+        [ regex $ Text.unpack suffixName
+        ]
+      , prod = const production
+      }
+
+
+ruleMultiply :: Rule
+ruleMultiply = Rule
+  { name = "compose by multiplication"
   , pattern =
     [ dimension Numeral
-    , regex "([kmg])"
+    , Predicate isMultipliable
     ]
-  , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v}:
-       Token RegexMatch (GroupMatch (match:_)):
-       _) -> case Text.toLower match of
-         "k" -> double $ v * 1e3
-         "m" -> double $ v * 1e6
-         "g" -> double $ v * 1e9
-         _   -> Nothing
+  , prod = \case
+      (token1:token2:_) -> multiply token1 token2
       _ -> Nothing
   }
 
-ruleInteger4 :: Rule
-ruleInteger4 = Rule
-  { name = "integer 21..99"
+ruleIntegerWithThousandsSeparator :: Rule
+ruleIntegerWithThousandsSeparator = Rule
+  { name = "integer with thousands separator ,"
   , pattern =
-    [ oneOf [70, 20, 60, 50, 40, 90, 30, 80]
-    , numberBetween 1 10
+    [ regex "(\\d{1,3}(,\\d\\d\\d){1,5})"
     ]
-  , prod = \tokens -> case tokens of
-      (Token Numeral NumeralData{TNumeral.value = v1}:
-       Token Numeral NumeralData{TNumeral.value = v2}:
-       _) -> double $ v1 + v2
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):
+       _) -> let fmt = Text.replace "," Text.empty match
+        in parseDouble fmt >>= double
       _ -> Nothing
   }
 
-ruleInteger2 :: Rule
-ruleInteger2 = Rule
-  { name = "integer (11..19)"
+ruleNumeralsIntersectNonconsectiveUnit :: Rule
+ruleNumeralsIntersectNonconsectiveUnit = Rule
+  { name = "integer with nonconsecutive unit modifiers"
   , pattern =
-    [ regex "十"
-    , numberBetween 1 10
+    [ Predicate isPositive
+    , regex "零|〇"
+    , Predicate isPositive
     ]
-  , prod = \tokens -> case tokens of
-      (_:Token Numeral NumeralData{TNumeral.value = v}:_) -> double $ 10 + v
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v1}:_:
+       Token Numeral NumeralData{TNumeral.value = v2}:_) ->
+        sumConnectedNumbers v1 v2 (diffIntegerDigits v1 v2)
+        >>= double
       _ -> Nothing
   }
+  where
+    sumConnectedNumbers :: Double -> Double -> Int -> Maybe Double
+    sumConnectedNumbers v1 v2 d
+      | d <= 1 = Nothing
+      | otherwise = Just $ v1 + v2
 
-ruleIntegerWithThousandsSeparator :: Rule
-ruleIntegerWithThousandsSeparator = Rule
-  { name = "integer with thousands separator ,"
+ruleNumeralsIntersectConsecutiveUnit :: Rule
+ruleNumeralsIntersectConsecutiveUnit = Rule
+  { name = "integer with consecutive unit modifiers"
   , pattern =
-    [ regex "(\\d{1,3}(,\\d\\d\\d){1,5})"
+    [ Predicate isPositive
+    , Predicate isPositive
     ]
-  , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):
-       _) -> let fmt = Text.replace "," Text.empty match
-        in parseDouble fmt >>= double
+  , prod = \case
+      (Token Numeral NumeralData{TNumeral.value = v1}:
+       Token Numeral NumeralData{TNumeral.value = v2}:_) ->
+        sumConnectedNumbers v1 v2 (diffIntegerDigits v1 v2)
+        >>= double
       _ -> Nothing
   }
+  where
+    sumConnectedNumbers :: Double -> Double -> Int -> Maybe Double
+    sumConnectedNumbers v1 v2 d
+      | d == 1 = Just $ v1 + v2
+      | otherwise = Nothing
 
 rules :: [Rule]
 rules =
   [ ruleDecimalNumeral
   , ruleDecimalWithThousandsSeparator
-  , ruleInteger2
-  , ruleInteger3
-  , ruleInteger4
-  , ruleInteger5
+  , ruleInteger
   , ruleIntegerWithThousandsSeparator
   , ruleNumeral
+  , ruleNumeralsIntersectConsecutiveUnit
+  , ruleNumeralsIntersectNonconsectiveUnit
   , ruleNumeralsPrefixWithNegativeOrMinus
-  , ruleNumeralsSuffixesKMG
+  , ruleMultiply
   ]
+  ++ ruleNumeralSuffixes
diff --git a/Duckling/Ordinal/AR/Corpus.hs b/Duckling/Ordinal/AR/Corpus.hs
--- a/Duckling/Ordinal/AR/Corpus.hs
+++ b/Duckling/Ordinal/AR/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/AR/Rules.hs b/Duckling/Ordinal/AR/Rules.hs
--- a/Duckling/Ordinal/AR/Rules.hs
+++ b/Duckling/Ordinal/AR/Rules.hs
@@ -15,7 +15,6 @@
   ) where
 
 import Data.HashMap.Strict (HashMap)
-import Data.String
 import Data.Text (Text)
 import Prelude
 import qualified Data.Text as Text
diff --git a/Duckling/Ordinal/BG/Corpus.hs b/Duckling/Ordinal/BG/Corpus.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/BG/Corpus.hs
@@ -0,0 +1,262 @@
+-- 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.Ordinal.BG.Corpus
+  ( corpus
+  ) where
+
+import Data.String
+import Prelude
+
+import Duckling.Locale
+import Duckling.Ordinal.Types
+import Duckling.Resolve
+import Duckling.Testing.Types
+
+corpus :: Corpus
+corpus = (testContext {locale = makeLocale BG Nothing}, testOptions, allExamples)
+
+allExamples :: [Example]
+allExamples = concat
+  [ examples (OrdinalData 1)
+             [ "първи"
+             , "първите"
+             , "първия"
+             , "първият"
+             , "първо"
+             , "първото"
+             , "първа"
+             , "първата"
+             , "1ви"
+             , "1-ви"
+             , "1вите"
+             , "1-вите"
+             , "1вия"
+             , "1-вия"
+             , "1вият"
+             , "1-вият"
+             , "1во"
+             , "1-во"
+             , "1вото"
+             , "1-вото"
+             , "1ва"
+             , "1-ва"
+             , "1вата"
+             , "1-вата"
+             ]
+  , examples (OrdinalData 3)
+             [ "трети"
+             , "третите"
+             , "третия"
+             , "третият"
+             , "трето"
+             , "третото"
+             , "трета"
+             , "третата"
+             , "3ти"
+             , "3-ти"
+             , "3тите"
+             , "3-тите"
+             , "3тия"
+             , "3-тия"
+             , "3тият"
+             , "3-тият"
+             , "3то"
+             , "3-то"
+             , "3тото"
+             , "3-тото"
+             , "3та"
+             , "3-та"
+             , "3тата"
+             , "3-тата"
+             ]
+  , examples (OrdinalData 8)
+             [ "осми"
+             , "осмите"
+             , "осмия"
+             , "осмият"
+             , "осмо"
+             , "осмото"
+             , "осма"
+             , "осмата"
+             , "8ми"
+             , "8-ми"
+             , "8мите"
+             , "8-мите"
+             , "8мия"
+             , "8-мия"
+             , "8мият"
+             , "8-мият"
+             , "8мо"
+             , "8-мо"
+             , "8мото"
+             , "8-мото"
+             , "8ма"
+             , "8-ма"
+             , "8мата"
+             , "8-мата"
+             ]
+  , examples (OrdinalData 15)
+             [ "петнадесети"
+             , "петнадесетите"
+             , "петнадесетия"
+             , "петнадесетият"
+             , "петнадесето"
+             , "петнадесетото"
+             , "петнадесета"
+             , "петнадесетата"
+             , "15ти"
+             , "15-ти"
+             , "15тите"
+             , "15-тите"
+             , "15тия"
+             , "15-тия"
+             , "15тият"
+             , "15-тият"
+             , "15то"
+             , "15-то"
+             , "15тото"
+             , "15-тото"
+             , "15та"
+             , "15-та"
+             , "15тата"
+             , "15-тата"
+             ]
+  , examples (OrdinalData 21)
+             [ "двадесет и първи"
+             , "двадесет и първите"
+             , "двадесет и първия"
+             , "двадесет и първият"
+             , "двадесет и първо"
+             , "двадесет и първото"
+             , "двадесет и първа"
+             , "двадесет и първата"
+             , "21ви"
+             , "21-ви"
+             , "21вите"
+             , "21-вите"
+             , "21вия"
+             , "21-вия"
+             , "21вият"
+             , "21-вият"
+             , "21во"
+             , "21-во"
+             , "21вото"
+             , "21-вото"
+             , "21ва"
+             , "21-ва"
+             , "21вата"
+             , "21-вата"
+             ]
+  , examples (OrdinalData 23)
+             [ "двадесет и трети"
+             , "двадесет и третите"
+             , "двадесет и третия"
+             , "двадесет и третият"
+             , "двадесет и трето"
+             , "двадесет и третото"
+             , "двадесет и трета"
+             , "двадесет и третата"
+             , "23ти"
+             , "23-ти"
+             , "23тите"
+             , "23-тите"
+             , "23тия"
+             , "23-тия"
+             , "23тият"
+             , "23-тият"
+             , "23то"
+             , "23-то"
+             , "23тото"
+             , "23-тото"
+             , "23та"
+             , "23-та"
+             , "23тата"
+             , "23-тата"
+             ]
+  , examples (OrdinalData 31)
+             [ "тридесет и първи"
+             , "тридесет и първите"
+             , "тридесет и първия"
+             , "тридесет и първият"
+             , "тридесет и първо"
+             , "тридесет и първото"
+             , "тридесет и първа"
+             , "тридесет и първата"
+             , "31ви"
+             , "31-ви"
+             , "31вите"
+             , "31-вите"
+             , "31вия"
+             , "31-вия"
+             , "31вият"
+             , "31-вият"
+             , "31во"
+             , "31-во"
+             , "31вото"
+             , "31-вото"
+             , "31ва"
+             , "31-ва"
+             , "31вата"
+             , "31-вата"
+             ]
+  , examples (OrdinalData 48)
+             [ "четирдесет и осми"
+             , "четирдесет и осмите"
+             , "четирдесет и осмия"
+             , "четирдесет и осмият"
+             , "четирдесет и осмо"
+             , "четирдесет и осмото"
+             , "четирдесет и осма"
+             , "четирдесет и осмата"
+             , "48ми"
+             , "48-ми"
+             , "48мите"
+             , "48-мите"
+             , "48мия"
+             , "48-мия"
+             , "48мият"
+             , "48-мият"
+             , "48мо"
+             , "48-мо"
+             , "48мото"
+             , "48-мото"
+             , "48ма"
+             , "48-ма"
+             , "48мата"
+             , "48-мата"
+             ]
+  , examples (OrdinalData 99)
+             [ "деветдесет и девети"
+             , "деветдесет и деветите"
+             , "деветдесет и деветия"
+             , "деветдесет и деветият"
+             , "деветдесет и девето"
+             , "деветдесет и деветото"
+             , "деветдесет и девета"
+             , "деветдесет и деветата"
+             , "99ти"
+             , "99-ти"
+             , "99тите"
+             , "99-тите"
+             , "99тия"
+             , "99-тия"
+             , "99тият"
+             , "99-тият"
+             , "99то"
+             , "99-то"
+             , "99тото"
+             , "99-тото"
+             , "99та"
+             , "99-та"
+             , "99тата"
+             , "99-тата"
+             ]
+  ]
diff --git a/Duckling/Ordinal/BG/Rules.hs b/Duckling/Ordinal/BG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ordinal/BG/Rules.hs
@@ -0,0 +1,110 @@
+-- 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.Ordinal.BG.Rules
+  ( rules
+  ) where
+
+import Data.HashMap.Strict (HashMap)
+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 (parseInt)
+import Duckling.Ordinal.Helpers
+import Duckling.Regex.Types
+import Duckling.Types
+
+ordinalsMap :: HashMap Text Int
+ordinalsMap = HashMap.fromList
+  [ ( "първ"         , 1 )
+  , ( "втор"         , 2 )
+  , ( "трет"         , 3 )
+  , ( "четвърт"      , 4 )
+  , ( "пет"          , 5 )
+  , ( "шест"         , 6 )
+  , ( "седм"         , 7 )
+  , ( "осм"          , 8 )
+  , ( "девет"        , 9 )
+  , ( "десет"        , 10 )
+  , ( "единадесет"   , 11 )
+  , ( "дванадесет"   , 12 )
+  , ( "тринадесет"   , 13 )
+  , ( "четиринадесет", 14 )
+  , ( "петнадесет"   , 15 )
+  , ( "шестнадесет"  , 16 )
+  , ( "седемнадесет" , 17 )
+  , ( "осемнадесет"  , 18 )
+  , ( "деветнадесет" , 19 )
+  , ( "двадесет"     , 20 )
+  ]
+
+ruleOrdinalsFirstth :: Rule
+ruleOrdinalsFirstth = Rule
+  { name = "ordinals (first..19th)"
+  , pattern =
+    [ regex "(първ|втор|трет|четвърт|пет|шест|седм|осм|девет|десет|единадесет|дванадесет|тринадесет|четиринадесет|петнадесет|шестнадесет|седемнадесет|осемнадесет|деветнадесет|двадесет)(и(я(т)?|те)?|а(та)?|о(то)?)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsMap
+      _ -> Nothing
+  }
+
+dozensMap :: HashMap Text Int
+dozensMap = HashMap.fromList
+  [ ( "двадесет"  , 20 )
+  , ( "тридесет"  , 30 )
+  , ( "четирдесет", 40 )
+  , ( "петдесет"  , 50 )
+  , ( "шестдесет" , 60 )
+  , ( "седемдесет", 70 )
+  , ( "осемдесет" , 80 )
+  , ( "деветдесет", 90 )
+  ]
+
+ruleOrdinal :: Rule
+ruleOrdinal = Rule
+  { name = "ordinal 21..99"
+  , pattern =
+    [ regex "(двадесет|тридесет|четирдесет|петдесет|шестдесет|седемдесет|осемдесет|деветдесет)"
+    , regex "и (първ|втор|трет|четвърт|пет|шест|седм|осм|девет)(и(ят?|те)?|а(та)?|о(то)?)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (m1:_)):
+       Token RegexMatch (GroupMatch (m2:_)):
+       _) -> do
+         dozen <- HashMap.lookup (Text.toLower m1) dozensMap
+         unit <- HashMap.lookup (Text.toLower m2) ordinalsMap
+         Just . ordinal $ dozen + unit
+      _ -> Nothing
+  }
+
+ruleOrdinalDigits :: Rule
+ruleOrdinalDigits = Rule
+  { name = "ordinal (digits)"
+  , pattern =
+    [ regex "0*(\\d+)-?((в|р|м|т)(и(я(т)?|те)?|а(та)?|о(то)?))"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> ordinal <$> parseInt match
+      _ -> Nothing
+  }
+
+rules :: [Rule]
+rules =
+  [ ruleOrdinal
+  , ruleOrdinalDigits
+  , ruleOrdinalsFirstth
+  ]
diff --git a/Duckling/Ordinal/DA/Corpus.hs b/Duckling/Ordinal/DA/Corpus.hs
--- a/Duckling/Ordinal/DA/Corpus.hs
+++ b/Duckling/Ordinal/DA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale DA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale DA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/DE/Corpus.hs b/Duckling/Ordinal/DE/Corpus.hs
--- a/Duckling/Ordinal/DE/Corpus.hs
+++ b/Duckling/Ordinal/DE/Corpus.hs
@@ -22,10 +22,10 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale DE Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale DE Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale DE Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale DE Nothing}, testOptions, examples)
   where
     examples =
       [ "1.1"
diff --git a/Duckling/Ordinal/EL/Corpus.hs b/Duckling/Ordinal/EL/Corpus.hs
--- a/Duckling/Ordinal/EL/Corpus.hs
+++ b/Duckling/Ordinal/EL/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale EL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale EL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/EN/Corpus.hs b/Duckling/Ordinal/EN/Corpus.hs
--- a/Duckling/Ordinal/EN/Corpus.hs
+++ b/Duckling/Ordinal/EN/Corpus.hs
@@ -9,16 +9,17 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.Ordinal.EN.Corpus
-  ( corpus ) where
+  ( corpus
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 
 import Duckling.Ordinal.Types
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/EN/Rules.hs b/Duckling/Ordinal/EN/Rules.hs
--- a/Duckling/Ordinal/EN/Rules.hs
+++ b/Duckling/Ordinal/EN/Rules.hs
@@ -70,7 +70,6 @@
   , ( "ninety", 90 )
   ]
 
-
 ruleOrdinals :: Rule
 ruleOrdinals = Rule
   { name = "ordinals (first..twentieth,thirtieth,...)"
diff --git a/Duckling/Ordinal/ES/Corpus.hs b/Duckling/Ordinal/ES/Corpus.hs
--- a/Duckling/Ordinal/ES/Corpus.hs
+++ b/Duckling/Ordinal/ES/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/ET/Corpus.hs b/Duckling/Ordinal/ET/Corpus.hs
--- a/Duckling/Ordinal/ET/Corpus.hs
+++ b/Duckling/Ordinal/ET/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ET Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ET Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/FR/Corpus.hs b/Duckling/Ordinal/FR/Corpus.hs
--- a/Duckling/Ordinal/FR/Corpus.hs
+++ b/Duckling/Ordinal/FR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/GA/Corpus.hs b/Duckling/Ordinal/GA/Corpus.hs
--- a/Duckling/Ordinal/GA/Corpus.hs
+++ b/Duckling/Ordinal/GA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/HE/Corpus.hs b/Duckling/Ordinal/HE/Corpus.hs
--- a/Duckling/Ordinal/HE/Corpus.hs
+++ b/Duckling/Ordinal/HE/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HE Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HE Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/HI/Corpus.hs b/Duckling/Ordinal/HI/Corpus.hs
--- a/Duckling/Ordinal/HI/Corpus.hs
+++ b/Duckling/Ordinal/HI/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HI Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HI Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/HR/Corpus.hs b/Duckling/Ordinal/HR/Corpus.hs
--- a/Duckling/Ordinal/HR/Corpus.hs
+++ b/Duckling/Ordinal/HR/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/HU/Corpus.hs b/Duckling/Ordinal/HU/Corpus.hs
--- a/Duckling/Ordinal/HU/Corpus.hs
+++ b/Duckling/Ordinal/HU/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/ID/Corpus.hs b/Duckling/Ordinal/ID/Corpus.hs
--- a/Duckling/Ordinal/ID/Corpus.hs
+++ b/Duckling/Ordinal/ID/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ID Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ID Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/IT/Corpus.hs b/Duckling/Ordinal/IT/Corpus.hs
--- a/Duckling/Ordinal/IT/Corpus.hs
+++ b/Duckling/Ordinal/IT/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/JA/Corpus.hs b/Duckling/Ordinal/JA/Corpus.hs
--- a/Duckling/Ordinal/JA/Corpus.hs
+++ b/Duckling/Ordinal/JA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale JA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/KO/Corpus.hs b/Duckling/Ordinal/KO/Corpus.hs
--- a/Duckling/Ordinal/KO/Corpus.hs
+++ b/Duckling/Ordinal/KO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/NB/Corpus.hs b/Duckling/Ordinal/NB/Corpus.hs
--- a/Duckling/Ordinal/NB/Corpus.hs
+++ b/Duckling/Ordinal/NB/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/NL/Corpus.hs b/Duckling/Ordinal/NL/Corpus.hs
--- a/Duckling/Ordinal/NL/Corpus.hs
+++ b/Duckling/Ordinal/NL/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/PL/Corpus.hs b/Duckling/Ordinal/PL/Corpus.hs
--- a/Duckling/Ordinal/PL/Corpus.hs
+++ b/Duckling/Ordinal/PL/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples =
diff --git a/Duckling/Ordinal/PT/Corpus.hs b/Duckling/Ordinal/PT/Corpus.hs
--- a/Duckling/Ordinal/PT/Corpus.hs
+++ b/Duckling/Ordinal/PT/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/RO/Corpus.hs b/Duckling/Ordinal/RO/Corpus.hs
--- a/Duckling/Ordinal/RO/Corpus.hs
+++ b/Duckling/Ordinal/RO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/RU/Corpus.hs b/Duckling/Ordinal/RU/Corpus.hs
--- a/Duckling/Ordinal/RU/Corpus.hs
+++ b/Duckling/Ordinal/RU/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/RU/Rules.hs b/Duckling/Ordinal/RU/Rules.hs
--- a/Duckling/Ordinal/RU/Rules.hs
+++ b/Duckling/Ordinal/RU/Rules.hs
@@ -8,14 +8,17 @@
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE NoRebindableSyntax #-}
 
 module Duckling.Ordinal.RU.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
-import Control.Monad (join)
-import qualified Data.Text as Text
-import Prelude
+import Data.HashMap.Strict (HashMap)
 import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import qualified Data.Text as Text
 
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
@@ -23,6 +26,42 @@
 import Duckling.Regex.Types
 import Duckling.Types
 
+ordinalsFirstthMap :: HashMap Text.Text Int
+ordinalsFirstthMap = HashMap.fromList
+  [ ( "перв", 1 )
+  , ( "втор", 2 )
+  , ( "трет", 3 )
+  , ( "четверт", 4 )
+  , ( "пят", 5 )
+  , ( "шест", 6 )
+  , ( "седьм", 7 )
+  , ( "восьм", 8 )
+  , ( "девят", 9 )
+  , ( "десят", 10 )
+  , ( "одинадцат", 11 )
+  , ( "двенадцат", 12 )
+  , ( "тринадцат", 13 )
+  , ( "четырнадцат", 14 )
+  , ( "пятнадцат", 15 )
+  , ( "шестнадцат", 16 )
+  , ( "семнадцат", 17 )
+  , ( "восемнадцат", 18 )
+  , ( "девятнадцат", 19 )
+  , ( "двадцат", 20 )
+  ]
+
+cardinalsMap :: HashMap Text.Text Int
+cardinalsMap = HashMap.fromList
+  [ ( "двадцать", 20 )
+  , ( "тридцать", 30 )
+  , ( "сорок", 40 )
+  , ( "пятьдесят", 50 )
+  , ( "шестьдесят", 60 )
+  , ( "семьдесят", 70 )
+  , ( "восемьдесят", 80 )
+  , ( "девяносто", 90 )
+  ]
+
 ruleOrdinalsFirstth :: Rule
 ruleOrdinalsFirstth = Rule
   { name = "ordinals (first..19th)"
@@ -30,28 +69,8 @@
     [ regex "(перв|втор|трет|четверт|пят|шест|седьм|восьм|девят|десят|одинадцат|двенадцат|тринадцат|четырнадцат|пятнадцат|шестнадцат|семнадцат|восемнадцат|девятнадцат|двадцат)(ье(го|й)?|ого|ый|ой|ий|ая|ое|ья)"
     ]
   , prod = \tokens -> case tokens of
-      (Token RegexMatch (GroupMatch (match:_)):_) -> case Text.toLower match of
-        "перв" -> Just $ ordinal 1
-        "втор" -> Just $ ordinal 2
-        "трет" -> Just $ ordinal 3
-        "четверт" -> Just $ ordinal 4
-        "пят" -> Just $ ordinal 5
-        "шест" -> Just $ ordinal 6
-        "седьм" -> Just $ ordinal 7
-        "восьм" -> Just $ ordinal 8
-        "девят" -> Just $ ordinal 9
-        "десят" -> Just $ ordinal 10
-        "одинадцат" -> Just $ ordinal 11
-        "двенадцат" -> Just $ ordinal 12
-        "тринадцат" -> Just $ ordinal 13
-        "четырнадцат" -> Just $ ordinal 14
-        "пятнадцат" -> Just $ ordinal 15
-        "шестнадцат" -> Just $ ordinal 16
-        "семнадцат" -> Just $ ordinal 17
-        "восемнадцат" -> Just $ ordinal 18
-        "девятнадцат" -> Just $ ordinal 19
-        "двадцат" -> Just $ ordinal 20
-        _ -> Nothing
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        ordinal <$> HashMap.lookup (Text.toLower match) ordinalsFirstthMap
       _ -> Nothing
   }
 
@@ -66,27 +85,8 @@
       (Token RegexMatch (GroupMatch (m1:_)):
        Token RegexMatch (GroupMatch (m2:_)):
        _) -> do
-         dozen <- case Text.toLower m1 of
-           "двадцать" -> Just 20
-           "тридцать" -> Just 30
-           "сорок" -> Just 40
-           "пятьдесят" -> Just 50
-           "шестьдесят" -> Just 60
-           "семьдесят" -> Just 70
-           "восемьдесят" -> Just 80
-           "девяносто" -> Just 90
-           _ -> Nothing
-         unit <- case Text.toLower m2 of
-           "перв" -> Just 1
-           "втор" -> Just 2
-           "трет" -> Just 3
-           "четверт" -> Just 4
-           "пят" -> Just 5
-           "шест" -> Just 6
-           "седьм" -> Just 7
-           "восьм" -> Just 8
-           "девят" -> Just 9
-           _ -> Nothing
+         dozen <- HashMap.lookup (Text.toLower m1) cardinalsMap
+         unit <- HashMap.lookup (Text.toLower m2) ordinalsFirstthMap
          Just . ordinal $ dozen + unit
       _ -> Nothing
   }
diff --git a/Duckling/Ordinal/SV/Corpus.hs b/Duckling/Ordinal/SV/Corpus.hs
--- a/Duckling/Ordinal/SV/Corpus.hs
+++ b/Duckling/Ordinal/SV/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale SV Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/TR/Corpus.hs b/Duckling/Ordinal/TR/Corpus.hs
--- a/Duckling/Ordinal/TR/Corpus.hs
+++ b/Duckling/Ordinal/TR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/Types.hs b/Duckling/Ordinal/Types.hs
--- a/Duckling/Ordinal/Types.hs
+++ b/Duckling/Ordinal/Types.hs
@@ -28,7 +28,7 @@
 
 instance Resolve OrdinalData where
   type ResolvedValue OrdinalData = OrdinalData
-  resolve _ x = Just x
+  resolve _ _ x = Just (x, False)
 
 instance ToJSON OrdinalData where
   toJSON (OrdinalData value) = object
diff --git a/Duckling/Ordinal/UK/Corpus.hs b/Duckling/Ordinal/UK/Corpus.hs
--- a/Duckling/Ordinal/UK/Corpus.hs
+++ b/Duckling/Ordinal/UK/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale UK Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale UK Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/VI/Corpus.hs b/Duckling/Ordinal/VI/Corpus.hs
--- a/Duckling/Ordinal/VI/Corpus.hs
+++ b/Duckling/Ordinal/VI/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale VI Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale VI Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Ordinal/ZH/Corpus.hs b/Duckling/Ordinal/ZH/Corpus.hs
--- a/Duckling/Ordinal/ZH/Corpus.hs
+++ b/Duckling/Ordinal/ZH/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/PhoneNumber/Corpus.hs b/Duckling/PhoneNumber/Corpus.hs
--- a/Duckling/PhoneNumber/Corpus.hs
+++ b/Duckling/PhoneNumber/Corpus.hs
@@ -20,10 +20,10 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "12345"
diff --git a/Duckling/PhoneNumber/PT/Corpus.hs b/Duckling/PhoneNumber/PT/Corpus.hs
--- a/Duckling/PhoneNumber/PT/Corpus.hs
+++ b/Duckling/PhoneNumber/PT/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/PhoneNumber/Types.hs b/Duckling/PhoneNumber/Types.hs
--- a/Duckling/PhoneNumber/Types.hs
+++ b/Duckling/PhoneNumber/Types.hs
@@ -37,8 +37,8 @@
 
 instance Resolve PhoneNumberData where
   type ResolvedValue PhoneNumberData = PhoneNumberValue
-  resolve _ PhoneNumberData {prefix, number, extension} = Just PhoneNumberValue
-    {value = Text.concat [p, number, e]}
+  resolve _ _ PhoneNumberData {prefix, number, extension} = Just
+    (PhoneNumberValue {value = Text.concat [p, number, e]}, False)
     where
       p = case prefix of
         Just p -> "(+" <> TS.showt p <> ") "
diff --git a/Duckling/Quantity/AR/Corpus.hs b/Duckling/Quantity/AR/Corpus.hs
--- a/Duckling/Quantity/AR/Corpus.hs
+++ b/Duckling/Quantity/AR/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/EN/Corpus.hs b/Duckling/Quantity/EN/Corpus.hs
--- a/Duckling/Quantity/EN/Corpus.hs
+++ b/Duckling/Quantity/EN/Corpus.hs
@@ -18,7 +18,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/FR/Corpus.hs b/Duckling/Quantity/FR/Corpus.hs
--- a/Duckling/Quantity/FR/Corpus.hs
+++ b/Duckling/Quantity/FR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/HR/Corpus.hs b/Duckling/Quantity/HR/Corpus.hs
--- a/Duckling/Quantity/HR/Corpus.hs
+++ b/Duckling/Quantity/HR/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/KO/Corpus.hs b/Duckling/Quantity/KO/Corpus.hs
--- a/Duckling/Quantity/KO/Corpus.hs
+++ b/Duckling/Quantity/KO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/PT/Corpus.hs b/Duckling/Quantity/PT/Corpus.hs
--- a/Duckling/Quantity/PT/Corpus.hs
+++ b/Duckling/Quantity/PT/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/RO/Corpus.hs b/Duckling/Quantity/RO/Corpus.hs
--- a/Duckling/Quantity/RO/Corpus.hs
+++ b/Duckling/Quantity/RO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/RU/Corpus.hs b/Duckling/Quantity/RU/Corpus.hs
--- a/Duckling/Quantity/RU/Corpus.hs
+++ b/Duckling/Quantity/RU/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Quantity/Types.hs b/Duckling/Quantity/Types.hs
--- a/Duckling/Quantity/Types.hs
+++ b/Duckling/Quantity/Types.hs
@@ -55,33 +55,33 @@
 instance Resolve QuantityData where
   type ResolvedValue QuantityData = QuantityValue
 
-  resolve _ QuantityData {value = Just value
+  resolve _ _ QuantityData {value = Just value
                          , unit = Just unit
                          , aproduct = aproduct}
-   = Just $ simple unit value aproduct
+   = Just (simple unit value aproduct, False)
 
-  resolve _ QuantityData {value = Nothing
+  resolve _ _ QuantityData {value = Nothing
                          , unit = Just unit
                          , aproduct = aproduct
                          , minValue = Just from
                          , maxValue = Just to}
-   = Just $ between unit (from, to) aproduct
+   = Just (between unit (from, to) aproduct, False)
 
-  resolve _ QuantityData {value = Nothing
+  resolve _ _ QuantityData {value = Nothing
                          , unit = Just unit
                          , aproduct = aproduct
                          , minValue = Just from
                          , maxValue = Nothing}
-   = Just $ above unit from aproduct
+   = Just (above unit from aproduct, False)
 
-  resolve _ QuantityData {value = Nothing
+  resolve _ _ QuantityData {value = Nothing
                          , unit = Just unit
                          , aproduct = aproduct
                          , minValue = Nothing
                          , maxValue = Just to}
-   = Just $ under unit to aproduct
+   = Just (under unit to aproduct, False)
 
-  resolve _ _ = Nothing
+  resolve _ _ _ = Nothing
 
 data IntervalDirection = Above | Under
   deriving (Eq, Generic, Hashable, Ord, Show, NFData)
diff --git a/Duckling/Ranking/Classifiers.hs b/Duckling/Ranking/Classifiers.hs
--- a/Duckling/Ranking/Classifiers.hs
+++ b/Duckling/Ranking/Classifiers.hs
@@ -45,6 +45,7 @@
 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.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
 import qualified Duckling.Ranking.Classifiers.VI_XX as VI_XXClassifiers
@@ -82,6 +83,7 @@
 classifiers (Locale RO _) = RO_XXClassifiers.classifiers
 classifiers (Locale RU _) = RU_XXClassifiers.classifiers
 classifiers (Locale SV _) = SV_XXClassifiers.classifiers
+classifiers (Locale TA _) = TA_XXClassifiers.classifiers
 classifiers (Locale TR _) = TR_XXClassifiers.classifiers
 classifiers (Locale UK _) = UK_XXClassifiers.classifiers
 classifiers (Locale VI _) = VI_XXClassifiers.classifiers
diff --git a/Duckling/Ranking/Classifiers/DE_XX.hs b/Duckling/Ranking/Classifiers/DE_XX.hs
--- a/Duckling/Ranking/Classifiers/DE_XX.hs
+++ b/Duckling/Ranking/Classifiers/DE_XX.hs
@@ -35,11 +35,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.9246589815446716, unseen = -4.795790545596741,
+                     ClassData{prior = -0.921320080279157, unseen = -4.795790545596741,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 119},
                    koData =
-                     ClassData{prior = -0.5052854433903752, unseen = -5.209486152841421,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 181}}),
+                     ClassData{prior = -0.507486722500476, unseen = -5.204006687076795,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 180}}),
        ("exactly <time-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -52,13 +52,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("<hour-of-day> <half> (as relative minutes)",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
@@ -216,6 +209,13 @@
                                     ("<time-of-day> am|pm", -1.9095425048844386),
                                     ("hour", -1.349926716949016), ("minute", -2.1972245773362196)],
                                n = 8}}),
+       ("Neujahr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("absorption of , after named day",
         Classifier{okData =
                      ClassData{prior = -7.410797215372185e-2,
@@ -301,6 +301,13 @@
                                    [("hh:mmtime-of-day (latent)", -1.0986122886681098),
                                     ("minutehour", -1.0986122886681098)],
                                n = 1}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
                      ClassData{prior = -0.6931471805599453,
@@ -365,6 +372,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Valentinstag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("hour (grain)",
         Classifier{okData =
                      ClassData{prior = -0.15415067982725836,
@@ -391,285 +405,286 @@
                                n = 1}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.2639842810219578, unseen = -6.92951677076365,
+                     ClassData{prior = -0.26452876747706405,
+                               unseen = -6.926577033222725,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Samstag<time-of-day>  o'clock", -6.23539063760472),
-                                    ("hourday", -4.982627669109352),
-                                    ("<datetime> - <datetime> (interval)year", -4.982627669109352),
-                                    ("dayhour", -2.571828991475074),
-                                    ("daymonth", -3.167337702471103),
+                                   [("Samstag<time-of-day>  o'clock", -6.2324480165505225),
+                                    ("hourday", -4.979685048055154),
+                                    ("<datetime> - <datetime> (interval)year", -4.979685048055154),
+                                    ("dayhour", -2.568886370420876),
+                                    ("daymonth", -3.1879255788270995),
                                     ("<day-of-month>(ordinal) <named-month> year<time-of-day>  o'clock",
-                                     -6.23539063760472),
-                                    ("monthyear", -4.5306425453662955),
-                                    ("yearhour", -6.23539063760472),
-                                    ("Juliintersect", -6.23539063760472),
-                                    ("intersect<time-of-day>  o'clock", -4.095324474108449),
-                                    ("christmasyear", -6.23539063760472),
-                                    ("after lunchat <time-of-day>", -6.23539063760472),
+                                     -6.2324480165505225),
+                                    ("monthyear", -4.527699924312097),
+                                    ("yearhour", -6.2324480165505225),
+                                    ("Juliintersect", -6.2324480165505225),
+                                    ("intersect<time-of-day>  o'clock", -4.092381853054252),
+                                    ("after lunchat <time-of-day>", -6.2324480165505225),
                                     ("absorption of , after named daymm/dd/yyyy",
-                                     -6.23539063760472),
-                                    ("intersectJuli", -5.5422434570447745),
-                                    ("<day-of-month> (ordinal)Dienstag", -6.23539063760472),
-                                    ("intersect by 'of', 'from', 'syear", -5.829925529496556),
-                                    ("<time-of-day> am|pmintersect", -5.136778348936611),
-                                    ("<day-of-month> (ordinal)September", -5.829925529496556),
-                                    ("intersect<time> <part-of-day>", -4.155949095924885),
-                                    ("<time-of-day>  o'clockafter lunch", -5.5422434570447745),
-                                    ("<day-of-month> (ordinal)Mittwoch", -6.23539063760472),
-                                    ("Montagthis <cycle>", -6.23539063760472),
+                                     -6.2324480165505225),
+                                    ("intersectJuli", -5.539300835990577),
+                                    ("<day-of-month> (ordinal)Dienstag", -6.2324480165505225),
+                                    ("intersect by 'of', 'from', 'syear", -5.826982908442359),
+                                    ("<time-of-day> am|pmintersect", -5.133835727882413),
+                                    ("<day-of-month> (ordinal)September", -5.826982908442359),
+                                    ("intersect<time> <part-of-day>", -4.153006474870687),
+                                    ("<time-of-day>  o'clockafter lunch", -5.539300835990577),
+                                    ("<day-of-month> (ordinal)Mittwoch", -6.2324480165505225),
+                                    ("Montagthis <cycle>", -6.2324480165505225),
                                     ("<time> <part-of-day><time-of-day>  o'clock",
-                                     -6.23539063760472),
-                                    ("Oktoberyear", -5.136778348936611),
-                                    ("today<time-of-day>  o'clock", -6.23539063760472),
-                                    ("<time-of-day>  o'clockon <date>", -5.829925529496556),
-                                    ("<time-of-day> am|pmintersect by ','", -5.5422434570447745),
-                                    ("intersect by ','year", -5.136778348936611),
-                                    ("on <date><time-of-day>  o'clock", -6.23539063760472),
-                                    ("exactly <time-of-day>tomorrow", -5.829925529496556),
-                                    ("mm/dd<time-of-day>  o'clock", -6.23539063760472),
-                                    ("monthhour", -5.829925529496556),
+                                     -6.2324480165505225),
+                                    ("Oktoberyear", -5.133835727882413),
+                                    ("today<time-of-day>  o'clock", -6.2324480165505225),
+                                    ("<time-of-day>  o'clockon <date>", -5.826982908442359),
+                                    ("<time-of-day> am|pmintersect by ','", -5.539300835990577),
+                                    ("intersect by ','year", -5.133835727882413),
+                                    ("on <date><time-of-day>  o'clock", -6.2324480165505225),
+                                    ("exactly <time-of-day>tomorrow", -5.826982908442359),
+                                    ("mm/dd<time-of-day>  o'clock", -6.2324480165505225),
+                                    ("monthhour", -5.826982908442359),
                                     ("on <date>between <datetime> and <datetime> (interval)",
-                                     -6.23539063760472),
-                                    ("last <day-of-week> of <time>year", -6.23539063760472),
-                                    ("hourmonth", -5.829925529496556),
-                                    ("todayat <time-of-day>", -5.5422434570447745),
-                                    ("mm/ddabout <time-of-day>", -5.829925529496556),
+                                     -6.2324480165505225),
+                                    ("last <day-of-week> of <time>year", -6.2324480165505225),
+                                    ("hourmonth", -5.826982908442359),
+                                    ("todayat <time-of-day>", -5.539300835990577),
+                                    ("mm/ddabout <time-of-day>", -5.826982908442359),
                                     ("Donnerstagfrom <datetime> - <datetime> (interval)",
-                                     -5.829925529496556),
+                                     -5.826982908442359),
                                     ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -6.23539063760472),
-                                    ("on <date>at <time-of-day>", -5.829925529496556),
-                                    ("dayday", -3.0573368072567746),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.829925529496556),
+                                     -6.2324480165505225),
+                                    ("on <date>at <time-of-day>", -5.826982908442359),
+                                    ("dayday", -3.054394186202577),
+                                    ("<time> <part-of-day>at <time-of-day>", -5.826982908442359),
                                     ("<time-of-day> am|pmabsorption of , after named day",
-                                     -6.23539063760472),
-                                    ("about <time-of-day>on <date>", -6.23539063760472),
+                                     -6.2324480165505225),
+                                    ("about <time-of-day>on <date>", -6.2324480165505225),
                                     ("<hour-of-day> <integer> (as relative minutes)in|during the <part-of-day>",
-                                     -5.829925529496556),
-                                    ("<day-of-month> (ordinal)intersect", -5.136778348936611),
-                                    ("hourhour", -3.7096619932964647),
-                                    ("hh:mmintersect by ','", -4.982627669109352),
+                                     -5.826982908442359),
+                                    ("<day-of-month> (ordinal)intersect", -5.133835727882413),
+                                    ("hourhour", -3.7067193722422673),
+                                    ("hh:mmintersect by ','", -4.979685048055154),
                                     ("Donnerstagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.5422434570447745),
-                                    ("Dienstagthis <cycle>", -6.23539063760472),
-                                    ("<part-of-day> of <time>Februar", -5.829925529496556),
-                                    ("dayyear", -3.317619905520441),
-                                    ("Mittwochthis <cycle>", -6.23539063760472),
+                                     -5.539300835990577),
+                                    ("Dienstagthis <cycle>", -6.2324480165505225),
+                                    ("<part-of-day> of <time>Februar", -5.826982908442359),
+                                    ("dayyear", -3.3146772844662435),
+                                    ("Mittwochthis <cycle>", -6.2324480165505225),
                                     ("<time-of-day>  o'clockin|during the <part-of-day>",
-                                     -5.136778348936611),
-                                    ("tomorrow<time-of-day>  o'clock", -6.23539063760472),
-                                    ("<time-of-day>  o'clocktomorrow", -5.5422434570447745),
+                                     -5.133835727882413),
+                                    ("tomorrow<time-of-day>  o'clock", -6.2324480165505225),
+                                    ("<time-of-day>  o'clocktomorrow", -5.539300835990577),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.829925529496556),
+                                     -5.826982908442359),
                                     ("half <integer> (german style hour-of-day)after lunch",
-                                     -6.23539063760472),
+                                     -6.2324480165505225),
                                     ("absorption of , after named day<day-of-month>(ordinal) <named-month>",
-                                     -4.982627669109352),
-                                    ("hourminute", -5.5422434570447745),
-                                    ("the <day-of-month> (ordinal)Juli", -6.23539063760472),
+                                     -4.979685048055154),
+                                    ("hourminute", -5.539300835990577),
+                                    ("the <day-of-month> (ordinal)Juli", -6.2324480165505225),
                                     ("on <date><day-of-month>(ordinal) <named-month>",
-                                     -5.829925529496556),
-                                    ("minutemonth", -3.5612419881781916),
-                                    ("minutehour", -3.984098838998225),
+                                     -5.826982908442359),
+                                    ("minutemonth", -3.558299367123994),
+                                    ("minutehour", -3.9811562179440276),
                                     ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.319099905730565),
+                                     -5.316157284676367),
                                     ("absorption of , after named day<day-of-month>(ordinal) <named-month> year",
-                                     -5.829925529496556),
+                                     -5.826982908442359),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -5.136778348936611),
+                                     -5.133835727882413),
                                     ("<day-of-month>(ordinal) <named-month> year<time> <part-of-day>",
-                                     -6.23539063760472),
+                                     -6.2324480165505225),
                                     ("<hour-of-day> <integer> (as relative minutes)after lunch",
-                                     -6.23539063760472),
-                                    ("Donnerstag<time> timezone", -5.829925529496556),
-                                    ("Samstagat <time-of-day>", -5.829925529496556),
-                                    ("<time-of-day> am|pmSamstag", -6.23539063760472),
+                                     -6.2324480165505225),
+                                    ("Donnerstag<time> timezone", -5.826982908442359),
+                                    ("Samstagat <time-of-day>", -5.826982908442359),
+                                    ("<time-of-day> am|pmSamstag", -6.2324480165505225),
                                     ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -4.84909627648483),
-                                    ("this <part-of-day><time-of-day>  o'clock", -6.23539063760472),
+                                     -4.846153655430633),
+                                    ("this <part-of-day><time-of-day>  o'clock",
+                                     -6.2324480165505225),
                                     ("<day-of-month>(ordinal) <named-month>intersect",
-                                     -6.23539063760472),
-                                    ("hh:mmintersect", -3.793043602235516),
-                                    ("Donnerstaghh:mm", -6.23539063760472),
-                                    ("<day-of-month> (ordinal)Juli", -5.5422434570447745),
-                                    ("intersect by ','intersect", -4.982627669109352),
-                                    ("intersect by 'of', 'from', 'sJuli", -6.23539063760472),
-                                    ("<day-of-month> (ordinal)Oktober", -6.23539063760472),
+                                     -6.2324480165505225),
+                                    ("hh:mmintersect", -3.790100981181318),
+                                    ("Donnerstaghh:mm", -6.2324480165505225),
+                                    ("Weihnachtenyear", -6.2324480165505225),
+                                    ("<day-of-month> (ordinal)Juli", -5.539300835990577),
+                                    ("intersect by ','intersect", -4.979685048055154),
+                                    ("intersect by 'of', 'from', 'sJuli", -6.2324480165505225),
                                     ("half <integer> (german style hour-of-day)in|during the <part-of-day>",
-                                     -5.829925529496556),
+                                     -5.826982908442359),
                                     ("from <datetime> - <datetime> (interval)year",
-                                     -5.5422434570447745),
-                                    ("at <time-of-day>intersect", -4.443631168376665),
+                                     -5.539300835990577),
+                                    ("at <time-of-day>intersect", -4.440688547322468),
                                     ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.829925529496556),
+                                     -5.826982908442359),
                                     ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
-                                     -6.23539063760472),
+                                     -6.2324480165505225),
                                     ("absorption of , after named day<day-of-month> (ordinal)",
-                                     -4.982627669109352),
+                                     -4.979685048055154),
                                     ("Donnerstagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -6.23539063760472),
-                                    ("dayminute", -3.984098838998225),
+                                     -6.2324480165505225),
+                                    ("dayminute", -3.9811562179440276),
                                     ("on <date>from <datetime> - <datetime> (interval)",
-                                     -6.23539063760472),
-                                    ("Mittwochnext <cycle>", -6.23539063760472),
+                                     -6.2324480165505225),
+                                    ("Mittwochnext <cycle>", -6.2324480165505225),
                                     ("Donnerstagbetween <datetime> and <datetime> (interval)",
-                                     -6.23539063760472),
+                                     -6.2324480165505225),
                                     ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
-                                     -6.23539063760472),
-                                    ("intersectyear", -4.443631168376665),
-                                    ("on <date>intersect", -5.829925529496556),
-                                    ("on <date><day-of-month> (ordinal)", -5.829925529496556),
-                                    ("intersectSeptember", -3.4945506136795195),
-                                    ("<ordinal> <cycle> of <time>year", -6.23539063760472),
-                                    ("minuteday", -2.2557089837027595),
+                                     -6.2324480165505225),
+                                    ("intersectyear", -4.440688547322468),
+                                    ("on <date>intersect", -5.826982908442359),
+                                    ("on <date><day-of-month> (ordinal)", -5.826982908442359),
+                                    ("intersectSeptember", -3.4916079926253216),
+                                    ("<ordinal> <cycle> of <time>year", -6.2324480165505225),
+                                    ("minuteday", -2.252766362648562),
                                     ("absorption of , after named dayintersect",
-                                     -3.8374953648063497),
-                                    ("intersect by ','September", -4.731313240828446),
-                                    ("year<time-of-day>  o'clock", -6.23539063760472),
-                                    ("Juliyear", -5.829925529496556),
-                                    ("at <time-of-day>intersect by ','", -5.5422434570447745),
-                                    ("hh:mmabsorption of , after named day", -5.829925529496556),
-                                    ("intersect by ','<time> <part-of-day>", -5.319099905730565),
-                                    ("hh:mmon <date>", -3.793043602235516),
+                                     -3.8345527437521523),
+                                    ("intersect by ','September", -4.728370619774249),
+                                    ("year<time-of-day>  o'clock", -6.2324480165505225),
+                                    ("Juliyear", -5.826982908442359),
+                                    ("at <time-of-day>intersect by ','", -5.539300835990577),
+                                    ("hh:mmabsorption of , after named day", -5.826982908442359),
+                                    ("intersect by ','<time> <part-of-day>", -5.316157284676367),
+                                    ("hh:mmon <date>", -3.790100981181318),
                                     ("at <time-of-day>absorption of , after named day",
-                                     -6.23539063760472),
-                                    ("until <time-of-day>after lunch", -6.23539063760472),
-                                    ("mm/ddyear", -5.829925529496556),
-                                    ("intersect by ','<time-of-day>  o'clock", -5.319099905730565),
-                                    ("intersect<day-of-month> (ordinal)", -4.84909627648483),
-                                    ("absorption of , after named daymm/dd", -6.23539063760472),
-                                    ("on <date>September", -5.319099905730565),
-                                    ("Septemberyear", -5.829925529496556),
+                                     -6.2324480165505225),
+                                    ("until <time-of-day>after lunch", -6.2324480165505225),
+                                    ("mm/ddyear", -5.826982908442359),
+                                    ("intersect by ','<time-of-day>  o'clock", -5.316157284676367),
+                                    ("intersect<day-of-month> (ordinal)", -4.846153655430633),
+                                    ("absorption of , after named daymm/dd", -6.2324480165505225),
+                                    ("on <date>September", -5.316157284676367),
+                                    ("Septemberyear", -5.826982908442359),
                                     ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
-                                     -5.5422434570447745),
-                                    ("at <time-of-day>on <date>", -4.363588460703129),
-                                    ("intersectintersect", -4.095324474108449),
-                                    ("<day-of-month> (ordinal)Februar", -5.136778348936611),
-                                    ("dayweek", -5.136778348936611),
-                                    ("intersect by ','Juli", -5.5422434570447745),
+                                     -5.539300835990577),
+                                    ("at <time-of-day>on <date>", -4.360645839648932),
+                                    ("intersectintersect", -4.092381853054252),
+                                    ("<day-of-month> (ordinal)Februar", -5.133835727882413),
+                                    ("dayweek", -5.133835727882413),
+                                    ("intersect by ','Juli", -5.539300835990577),
                                     ("absorption of , after named daythe <day-of-month> (ordinal)",
-                                     -6.23539063760472),
-                                    ("weekyear", -5.829925529496556),
-                                    ("hh:mmin|during the <part-of-day>", -5.319099905730565),
-                                    ("Marzyear", -6.23539063760472),
-                                    ("tomorrowat <time-of-day>", -5.829925529496556),
+                                     -6.2324480165505225),
+                                    ("weekyear", -5.826982908442359),
+                                    ("hh:mmin|during the <part-of-day>", -5.316157284676367),
+                                    ("Marzyear", -6.2324480165505225),
+                                    ("tomorrowat <time-of-day>", -5.826982908442359),
                                     ("<hour-of-day> <integer> (as relative minutes)on <date>",
-                                     -6.23539063760472),
+                                     -6.2324480165505225),
                                     ("Donnerstag<time-of-day> - <time-of-day> (interval)",
-                                     -6.23539063760472),
+                                     -6.2324480165505225),
                                     ("Donnerstag<datetime> - <datetime> (interval)",
-                                     -6.23539063760472),
-                                    ("Sonntaglast <cycle>", -6.23539063760472),
-                                    ("at <time-of-day>tomorrow", -6.23539063760472),
+                                     -6.2324480165505225),
+                                    ("Sonntaglast <cycle>", -6.2324480165505225),
+                                    ("at <time-of-day>tomorrow", -6.2324480165505225),
                                     ("about <time-of-day>in|during the <part-of-day>",
-                                     -5.829925529496556),
+                                     -5.826982908442359),
                                     ("half <integer> (german style hour-of-day)on <date>",
-                                     -6.23539063760472),
-                                    ("this <part-of-day>at <time-of-day>", -5.829925529496556),
-                                    ("<datetime> - <datetime> (interval)Juli", -5.829925529496556),
+                                     -6.2324480165505225),
+                                    ("this <part-of-day>at <time-of-day>", -5.826982908442359),
+                                    ("<datetime> - <datetime> (interval)Juli", -5.826982908442359),
                                     ("after lunch<hour-of-day> <integer> (as relative minutes)",
-                                     -5.829925529496556),
-                                    ("<day-of-month> (ordinal)Marz", -6.23539063760472),
-                                    ("last <cycle> of <time>year", -5.829925529496556),
+                                     -5.826982908442359),
+                                    ("<day-of-month> (ordinal)Marz", -6.2324480165505225),
+                                    ("last <cycle> of <time>year", -5.826982908442359),
                                     ("<named-month> <day-of-month> (non ordinal)year",
-                                     -6.23539063760472),
+                                     -6.2324480165505225),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -6.23539063760472)],
-                               n = 427},
+                                     -6.2324480165505225)],
+                               n = 426},
                    koData =
-                     ClassData{prior = -1.4609558898889103, unseen = -6.05443934626937,
+                     ClassData{prior = -1.4591557093847622, unseen = -6.052089168924417,
                                likelihoods =
                                  HashMap.fromList
                                    [("Juli<day-of-month> (non ordinal) <named-month>",
-                                     -5.358941988364472),
+                                     -5.356586274672012),
                                     ("absorption of , after named daythe <day-of-month> (non ordinal)",
-                                     -5.358941988364472),
-                                    ("<datetime> - <datetime> (interval)year", -5.358941988364472),
-                                    ("dayhour", -4.665794807804526),
+                                     -5.356586274672012),
+                                    ("<datetime> - <datetime> (interval)year", -5.356586274672012),
+                                    ("dayhour", -4.663439094112067),
                                     ("<named-month> <day-of-month> (non ordinal)Juli",
-                                     -5.358941988364472),
-                                    ("daymonth", -3.48713981146288),
-                                    ("monthday", -4.953476880256307),
-                                    ("monthyear", -5.358941988364472),
-                                    ("yearhour", -5.358941988364472),
-                                    ("after lunchat <time-of-day>", -4.953476880256307),
-                                    ("mm/dduntil <time-of-day>", -4.953476880256307),
-                                    ("until <time-of-day>year", -4.953476880256307),
-                                    ("<day-of-month> (ordinal)Dienstag", -4.953476880256307),
-                                    ("absorption of , after named dayFebruar", -4.260329699696362),
-                                    ("on <date>Februar", -5.358941988364472),
-                                    ("intersect by 'of', 'from', 'syear", -4.665794807804526),
-                                    ("<time-of-day> am|pmintersect", -3.654193896126046),
-                                    ("intersect<time> <part-of-day>", -5.358941988364472),
-                                    ("<time-of-day>  o'clockafter lunch", -5.358941988364472),
-                                    ("<day-of-month> (ordinal)Mittwoch", -5.358941988364472),
-                                    ("after lunch<time-of-day>  o'clock", -5.358941988364472),
-                                    ("absorption of , after named dayhh:mm", -5.358941988364472),
-                                    ("<time-of-day> am|pmintersect by ','", -4.106179019869104),
+                                     -5.356586274672012),
+                                    ("daymonth", -3.484784097770421),
+                                    ("monthday", -4.951121166563848),
+                                    ("monthyear", -5.356586274672012),
+                                    ("yearhour", -5.356586274672012),
+                                    ("after lunchat <time-of-day>", -4.951121166563848),
+                                    ("mm/dduntil <time-of-day>", -4.951121166563848),
+                                    ("until <time-of-day>year", -4.951121166563848),
+                                    ("<day-of-month> (ordinal)Dienstag", -4.951121166563848),
+                                    ("absorption of , after named dayFebruar", -4.257973986003902),
+                                    ("on <date>Februar", -5.356586274672012),
+                                    ("intersect by 'of', 'from', 'syear", -4.663439094112067),
+                                    ("<time-of-day> am|pmintersect", -3.651838182433587),
+                                    ("intersect<time> <part-of-day>", -5.356586274672012),
+                                    ("<time-of-day>  o'clockafter lunch", -5.356586274672012),
+                                    ("<day-of-month> (ordinal)Mittwoch", -5.356586274672012),
+                                    ("after lunch<time-of-day>  o'clock", -5.356586274672012),
+                                    ("absorption of , after named dayhh:mm", -5.356586274672012),
+                                    ("<time-of-day> am|pmintersect by ','", -4.103823306176644),
                                     ("<time-of-day>  o'clock<time> <part-of-day>",
-                                     -4.442651256490317),
-                                    ("<time-of-day> am|pmFreitag", -4.953476880256307),
-                                    ("mm/ddhh:mm", -4.442651256490317),
-                                    ("monthhour", -5.358941988364472),
+                                     -4.440295542797857),
+                                    ("<time-of-day> am|pmFreitag", -4.951121166563848),
+                                    ("mm/ddhh:mm", -4.440295542797857),
+                                    ("monthhour", -5.356586274672012),
                                     ("on <date>between <datetime> and <datetime> (interval)",
-                                     -5.358941988364472),
-                                    ("todayat <time-of-day>", -5.358941988364472),
+                                     -5.356586274672012),
+                                    ("todayat <time-of-day>", -5.356586274672012),
                                     ("Donnerstagfrom <datetime> - <datetime> (interval)",
-                                     -4.953476880256307),
+                                     -4.951121166563848),
                                     ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -5.358941988364472),
-                                    ("dayday", -3.972647627244581),
+                                     -5.356586274672012),
+                                    ("dayday", -3.970291913552122),
                                     ("<time-of-day> am|pmabsorption of , after named day",
-                                     -4.953476880256307),
-                                    ("hourhour", -3.8548645915881976),
+                                     -4.951121166563848),
+                                    ("hourhour", -3.8525088778957386),
                                     ("Donnerstagfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.665794807804526),
-                                    ("Donnerstagafter <time-of-day>", -5.358941988364472),
-                                    ("dayyear", -3.2795004466846356),
-                                    ("minutemonth", -3.48713981146288),
-                                    ("Aprilyear", -5.358941988364472),
-                                    ("Dienstagafter <time-of-day>", -5.358941988364472),
+                                     -4.663439094112067),
+                                    ("Donnerstagafter <time-of-day>", -5.356586274672012),
+                                    ("dayyear", -3.2771447329921766),
+                                    ("minutemonth", -3.484784097770421),
+                                    ("Aprilyear", -5.356586274672012),
+                                    ("Dienstagafter <time-of-day>", -5.356586274672012),
                                     ("intersect<day-of-month>(ordinal) <named-month>",
-                                     -4.665794807804526),
-                                    ("Donnerstaghh:mm", -4.953476880256307),
-                                    ("<day-of-month> (ordinal)Juli", -4.953476880256307),
-                                    ("<day-of-month> (ordinal)hh:mm", -4.442651256490317),
+                                     -4.663439094112067),
+                                    ("Donnerstaghh:mm", -4.951121166563848),
+                                    ("<day-of-month> (ordinal)Juli", -4.951121166563848),
+                                    ("<day-of-month> (ordinal)hh:mm", -4.440295542797857),
                                     ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.358941988364472),
+                                     -5.356586274672012),
                                     ("August<day-of-month> (non ordinal) <named-month>",
-                                     -5.358941988364472),
-                                    ("at <time-of-day>intersect", -4.260329699696362),
+                                     -5.356586274672012),
+                                    ("at <time-of-day>intersect", -4.257973986003902),
                                     ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -4.953476880256307),
+                                     -4.951121166563848),
                                     ("Donnerstagbetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.358941988364472),
-                                    ("dayminute", -2.6847933389379426),
+                                     -5.356586274672012),
+                                    ("dayminute", -2.6824376252454836),
                                     ("on <date>from <datetime> - <datetime> (interval)",
-                                     -5.358941988364472),
+                                     -5.356586274672012),
                                     ("Donnerstagbetween <datetime> and <datetime> (interval)",
-                                     -5.358941988364472),
-                                    ("until <time-of-day>Juli", -5.358941988364472),
-                                    ("intersectSeptember", -3.7495040759303713),
-                                    ("minuteday", -2.3632097148104805),
-                                    ("intersect by ','September", -4.665794807804526),
-                                    ("at <time-of-day>intersect by ','", -4.665794807804526),
-                                    ("at <time-of-day>Freitag", -5.358941988364472),
+                                     -5.356586274672012),
+                                    ("until <time-of-day>Juli", -5.356586274672012),
+                                    ("intersectSeptember", -3.747148362237912),
+                                    ("minuteday", -2.3608540011180215),
+                                    ("intersect by ','September", -4.663439094112067),
+                                    ("at <time-of-day>intersect by ','", -4.663439094112067),
+                                    ("at <time-of-day>Freitag", -5.356586274672012),
                                     ("at <time-of-day>absorption of , after named day",
-                                     -5.358941988364472),
-                                    ("year<time> <part-of-day>", -5.358941988364472),
-                                    ("mm/ddyear", -3.8548645915881976),
-                                    ("intersect<day-of-month> (ordinal)", -4.665794807804526),
+                                     -5.356586274672012),
+                                    ("year<time> <part-of-day>", -5.356586274672012),
+                                    ("mm/ddyear", -3.8525088778957386),
+                                    ("intersect<day-of-month> (ordinal)", -4.663439094112067),
                                     ("<day-of-month> (ordinal)intersect by 'of', 'from', 's",
-                                     -4.953476880256307),
-                                    ("intersectintersect", -4.665794807804526),
-                                    ("Donnerstag<part-of-day> of <time>", -5.358941988364472),
-                                    ("<day-of-month> (ordinal)April", -5.358941988364472),
+                                     -4.951121166563848),
+                                    ("intersectintersect", -4.663439094112067),
+                                    ("Donnerstag<part-of-day> of <time>", -5.356586274672012),
+                                    ("<day-of-month> (ordinal)April", -5.356586274672012),
                                     ("Donnerstag<time-of-day> - <time-of-day> (interval)",
-                                     -5.358941988364472),
-                                    ("after <time-of-day>year", -5.358941988364472),
-                                    ("on <date>after <time-of-day>", -5.358941988364472),
-                                    ("tomorrownoon", -5.358941988364472)],
+                                     -5.356586274672012),
+                                    ("after <time-of-day>year", -5.356586274672012),
+                                    ("on <date>after <time-of-day>", -5.356586274672012),
+                                    ("tomorrownoon", -5.356586274672012)],
                                n = 129}}),
        ("<ordinal> <cycle> of <time>",
         Classifier{okData =
@@ -730,6 +745,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Muttertag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.15415067982725836,
@@ -778,6 +800,13 @@
                                    [("hh:mmtime-of-day (latent)", -1.0986122886681098),
                                     ("minutehour", -1.0986122886681098)],
                                n = 3}}),
+       ("Silvester",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("year (latent)",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
@@ -828,6 +857,13 @@
                      ClassData{prior = -2.4849066497880004,
                                unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Weihnachten",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("quarter to|till|before <integer> (hour-of-day)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -881,6 +917,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vatertag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("week (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -3.332204510175204,
@@ -908,13 +951,6 @@
                                    [("hourhour", -1.3862943611198906),
                                     ("morningtime-of-day (latent)", -1.3862943611198906)],
                                n = 1}}),
-       ("valentine's day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Sonntag",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -961,24 +997,22 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month>(ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -0.2231435513142097,
-                               unseen = -3.4657359027997265,
+                     ClassData{prior = -0.2411620568168881, unseen = -3.367295829986474,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinal (digits)Juli", -2.0476928433652555),
-                                    ("ordinal (digits)September", -2.3353749158170367),
-                                    ("ordinal (digits)Oktober", -2.740840023925201),
-                                    ("month", -0.8690378470236094),
-                                    ("ordinal (digits)Februar", -1.6422277352570913),
-                                    ("ordinals (first..19th)Marz", -2.740840023925201)],
-                               n = 12},
+                                   [("ordinal (digits)Juli", -1.9459101490553135),
+                                    ("ordinal (digits)September", -2.2335922215070942),
+                                    ("month", -0.8472978603872037),
+                                    ("ordinal (digits)Februar", -1.540445040947149),
+                                    ("ordinals (first..19th)Marz", -2.639057329615259)],
+                               n = 11},
                    koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
+                     ClassData{prior = -1.540445040947149, unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinal (digits)Juli", -1.466337068793427),
-                                    ("ordinal (digits)April", -1.8718021769015913),
-                                    ("month", -1.1786549963416462)],
+                                   [("ordinal (digits)Juli", -1.3862943611198906),
+                                    ("ordinal (digits)April", -1.791759469228055),
+                                    ("month", -1.0986122886681098)],
                                n = 3}}),
        ("numbers prefix with -, negative or minus",
         Classifier{okData =
@@ -1006,13 +1040,6 @@
                                    [("after lunch", -1.252762968495368),
                                     ("hour", -1.252762968495368)],
                                n = 1}}),
-       ("new year's eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("tomorrow",
         Classifier{okData =
                      ClassData{prior = -0.13353139262452263,
@@ -1022,13 +1049,6 @@
                      ClassData{prior = -2.0794415416798357,
                                unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("<time> after next",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
@@ -1245,8 +1265,8 @@
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
                                likelihoods =
                                  HashMap.fromList
-                                   [("a <unit-of-duration>christmas", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>christmas", -1.252762968495368),
+                                   [("<integer> <unit-of-duration>Weihnachten", -1.252762968495368),
+                                    ("a <unit-of-duration>Weihnachten", -1.252762968495368),
                                     ("yearday", -0.8472978603872037)],
                                n = 2},
                    koData =
@@ -1273,8 +1293,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Oktober",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -1505,15 +1525,14 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month> (ordinal)",
         Classifier{okData =
-                     ClassData{prior = -0.5520685823000397,
-                               unseen = -3.0910424533583156,
+                     ClassData{prior = -0.5753641449035618, unseen = -3.044522437723423,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..19th)", -1.6582280766035324),
-                                    ("ordinal (digits)", -0.2113090936672069)],
-                               n = 19},
+                                   [("ordinals (first..19th)", -1.6094379124341003),
+                                    ("ordinal (digits)", -0.2231435513142097)],
+                               n = 18},
                    koData =
-                     ClassData{prior = -0.8574502318512216, unseen = -2.833213344056216,
+                     ClassData{prior = -0.8266785731844679, unseen = -2.833213344056216,
                                likelihoods =
                                  HashMap.fromList
                                    [("ordinals (first..19th)", -0.8266785731844679),
@@ -1627,13 +1646,6 @@
                                     ("day", -1.791759469228055),
                                     ("day (grain)", -1.791759469228055)],
                                n = 2}}),
-       ("christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Tag der Deutschen Einheit",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
@@ -1641,13 +1653,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("new year's day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("next n <cycle>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -4.143134726391533,
@@ -1677,13 +1682,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -3.1354942159291497,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("halloween day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("by the end of <time>",
         Classifier{okData =
                      ClassData{prior = -infinity, unseen = -1.6094379124341003,
@@ -1823,9 +1821,9 @@
                      ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..19th)Dienstagchristmas",
-                                     -0.916290731874155)],
+                                   [("ordinals (first..19th)DienstagWeihnachten",
+                                     -0.916290731874155),
+                                    ("dayday", -0.916290731874155)],
                                n = 1}}),
        ("<named-month> <day-of-month> (non ordinal)",
         Classifier{okData =
@@ -1893,10 +1891,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ordinal (digits)",
         Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.995732273553991,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                     ClassData{prior = -0.3022808718729337,
+                               unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
                    koData =
-                     ClassData{prior = -1.3862943611198906,
+                     ClassData{prior = -1.3437347467010947,
                                unseen = -2.0794415416798357,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
        ("quarter (grain)",
@@ -1969,10 +1968,10 @@
                                  HashMap.fromList
                                    [("<time-of-day>  o'clock", -2.3025850929940455),
                                     ("intersect", -2.3025850929940455),
+                                    ("Weihnachten", -1.8971199848858813),
                                     ("day", -1.6094379124341003),
                                     ("time-of-day (latent)", -2.3025850929940455),
                                     ("hh:mm", -2.3025850929940455), ("hour", -1.8971199848858813),
-                                    ("christmas", -1.8971199848858813),
                                     ("minute", -2.3025850929940455)],
                                n = 6}}),
        ("day (grain)",
diff --git a/Duckling/Ranking/Classifiers/EN_CA.hs b/Duckling/Ranking/Classifiers/EN_CA.hs
--- a/Duckling/Ranking/Classifiers/EN_CA.hs
+++ b/Duckling/Ranking/Classifiers/EN_CA.hs
@@ -21,2389 +21,3102 @@
 classifiers :: Classifiers
 classifiers
   = HashMap.fromList
-      [("<integer> to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.7765287894989963, unseen = -5.225746673713201,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 184},
-                   koData =
-                     ClassData{prior = -0.616186139423817, unseen = -5.384495062789089,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 216}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6094379124341003),
-                                    ("dayday", -1.0986122886681098),
-                                    ("day (grain)yesterday", -1.6094379124341003)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.466337068793427),
-                                    ("year (grain)Christmas", -1.8718021769015913),
-                                    ("day (grain)intersect", -1.466337068793427),
-                                    ("yearday", -1.8718021769015913)],
-                               n = 3}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("integer after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8109302162163288),
-                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
-                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -2.1400661634962708),
-                                    ("ordinal (digits)February", -2.1400661634962708),
-                                    ("integer (numeric)April", -2.1400661634962708),
-                                    ("month", -1.4469189829363254)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.844007281325252e-2,
-                               unseen = -4.430816798843313,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("dayhour", -1.5284688499004333),
-                                    ("Mondayearly morning", -3.3202283191284883),
-                                    ("time-of-day (latent)tonight", -3.3202283191284883),
-                                    ("hourhour", -2.339399066116762),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("todaypart of days", -3.7256934272366524),
-                                    ("minutehour", -2.627081138568543),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.3202283191284883),
-                                    ("time-of-day (latent)this <part-of-day>", -3.7256934272366524),
-                                    ("Mondayin|during the <part-of-day>", -3.7256934272366524),
-                                    ("intersectpart of days", -3.7256934272366524),
-                                    ("intersectin|during the <part-of-day>", -3.7256934272366524),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("tomorrowpart of days", -2.339399066116762),
-                                    ("hh:mmin|during the <part-of-day>", -3.0325462466767075),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("yesterdaypart of days", -3.7256934272366524),
-                                    ("Mondaypart of days", -3.7256934272366524)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -2.367123614131617, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.740840023925201),
-                                    ("monthhour", -2.740840023925201),
-                                    ("hourhour", -2.740840023925201),
-                                    ("past year (latent)in|during the <part-of-day>",
-                                     -2.740840023925201),
-                                    ("Februaryin|during the <part-of-day>", -2.740840023925201),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.740840023925201)],
-                               n = 3}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -1.4271163556401458,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.2744368457017603, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.381875521765486e-2,
-                               unseen = -4.90527477843843,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.7992275112828016),
-                                    ("noon|midnight|EOD|end of day", -3.7992275112828016),
-                                    ("integer after|past <hour-of-day>", -3.7992275112828016),
-                                    ("half after|past <hour-of-day>", -4.204692619390966),
-                                    ("time-of-day (latent)", -1.7197859696029658),
-                                    ("hhmm (latent)", -3.5115454388310208),
-                                    ("<time-of-day> am|pm", -1.8067973465925955),
-                                    ("hh:mm", -3.288401887516811),
-                                    ("about|exactly <time-of-day>", -3.7992275112828016),
-                                    ("hour", -1.0911773101805915),
-                                    ("<time-of-day> sharp|exactly", -4.204692619390966),
-                                    ("minute", -2.0074680420547466)],
-                               n = 61},
-                   koData =
-                     ClassData{prior = -2.412933150162911, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.791759469228055), ("mm/dd", -3.295836866004329),
-                                    ("absorption of , after named day", -2.890371757896165),
-                                    ("intersect", -2.890371757896165),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Friday", -3.295836866004329), ("day", -0.8979415932059586),
-                                    ("the <day-of-month> (ordinal)", -2.890371757896165),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.6026896854443837),
-                                    ("hour", -3.295836866004329)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -1.8718021769015913,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.916290731874155),
-                                    ("hh:mmhh:mm", -0.916290731874155)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.916290731874155),
-                                    ("minutehour", -0.916290731874155)],
-                               n = 3}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from|since|after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("July", -3.3141860046725258),
-                                    ("time-of-day (latent)", -2.3978952727983707),
-                                    ("<time-of-day> am|pm", -2.3978952727983707),
-                                    ("hh:mm", -2.3978952727983707), ("hour", -1.8101086078962516),
-                                    ("month", -2.908720896564361), ("minute", -2.3978952727983707),
-                                    ("August", -3.3141860046725258)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -4.836281906951478,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.7297014486341915),
-                                    ("week", -4.135166556742356),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.135166556742356),
-                                    ("today", -4.135166556742356),
-                                    ("intersect", -2.7488721956224653),
-                                    ("second", -4.135166556742356), ("now", -3.4420193761824103),
-                                    ("tomorrow", -3.7297014486341915),
-                                    ("this|last|next <cycle>", -4.135166556742356),
-                                    ("day", -1.995100393246085),
-                                    ("time-of-day (latent)", -4.135166556742356),
-                                    ("<time-of-day> am|pm", -3.7297014486341915),
-                                    ("nograin", -3.4420193761824103),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.135166556742356),
-                                    ("Christmas", -3.4420193761824103),
-                                    ("hour", -2.8824035882469876),
-                                    ("<datetime> - <datetime> (interval)", -2.7488721956224653),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.430418464503931),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -3.7297014486341915),
-                                    ("minute", -1.6928195213731514),
-                                    ("right now", -4.135166556742356),
-                                    ("<month> dd-dd (interval)", -3.4420193761824103),
-                                    ("dd-dd <month> (interval)", -3.7297014486341915)],
-                               n = 49}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -4.652001563489282e-2,
-                               unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.2188758248682006),
-                                    ("<integer> more <unit-of-duration>", -3.912023005428146),
-                                    ("three-quarters of an hour", -2.995732273553991),
-                                    ("<integer> + '\"", -3.2188758248682006),
-                                    ("number.number hours", -3.912023005428146),
-                                    ("second", -3.506557897319982), ("day", -3.2188758248682006),
-                                    ("half an hour", -2.995732273553991),
-                                    ("<integer> <unit-of-duration>", -1.6094379124341003),
-                                    ("a <unit-of-duration>", -2.995732273553991),
-                                    ("quarter of an hour", -2.995732273553991),
-                                    ("hour", -2.5257286443082556),
-                                    ("about|exactly <duration>", -3.912023005428146),
-                                    ("<integer> and an half hour", -3.912023005428146),
-                                    ("minute", -1.2729656758128873)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -3.0910424533583156, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -1.8971199848858813),
-                                    ("<integer> <unit-of-duration>", -2.3025850929940455),
-                                    ("a <unit-of-duration>", -2.3025850929940455)],
-                               n = 2}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.8209805520698302,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.4957877464014501, unseen = -6.293419278846481,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("hourday", -3.8936738667599493),
-                                    ("dayhour", -2.765208614942159),
-                                    ("daymonth", -4.90527477843843),
-                                    ("monthday", -5.19295685089021),
-                                    ("monthyear", -3.9889840465642745),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.598421958998375),
-                                    ("Christmasyear", -5.598421958998375),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.598421958998375),
-                                    ("houryear", -5.598421958998375),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.90527477843843),
-                                    ("<time-of-day> am|pmintersect", -4.345658990503007),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -5.598421958998375),
-                                    ("Marchyear", -5.598421958998375),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
-                                     -5.19295685089021),
-                                    ("intersect<time-of-day> am|pm", -5.598421958998375),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.598421958998375),
-                                    ("monthhour", -5.19295685089021),
-                                    ("last <day-of-week> of <time>year", -5.598421958998375),
-                                    ("todayat <time-of-day>", -5.598421958998375),
-                                    ("Thursday<time> timezone", -3.8936738667599493),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("dayday", -3.58351893845611),
-                                    ("Thanksgiving Dayyear", -4.499809670330265),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.598421958998375),
-                                    ("Tuesdayin <named-month>", -5.598421958998375),
-                                    ("mm/ddat <time-of-day>", -5.598421958998375),
-                                    ("tonightat <time-of-day>", -5.598421958998375),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -4.90527477843843),
-                                    ("today<time-of-day> am|pm", -5.598421958998375),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.19295685089021),
-                                    ("at <time-of-day><time> <part-of-day>", -5.598421958998375),
-                                    ("mm/dd<time-of-day> am|pm", -5.598421958998375),
-                                    ("hourhour", -4.345658990503007),
-                                    ("<time-of-day> am|pmon <date>", -3.58351893845611),
-                                    ("Wednesdaythis|last|next <cycle>", -5.598421958998375),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.0943445622221),
-                                    ("dayyear", -3.1560749236291703),
-                                    ("last weekend of <named-month>year", -5.598421958998375),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursdayat <time-of-day>", -5.19295685089021),
-                                    ("<time-of-day> am|pmtomorrow", -4.90527477843843),
-                                    ("minutehour", -4.68213122712422),
-                                    ("Mother's Dayyear", -5.598421958998375),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.19295685089021),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -3.8936738667599493),
-                                    ("for <duration> from <time>December", -5.598421958998375),
-                                    ("tomorrow<time-of-day> sharp|exactly", -5.598421958998375),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.19295685089021),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.68213122712422),
-                                    ("Mondayin|during the <part-of-day>", -5.598421958998375),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.19295685089021),
-                                    ("intersectin|during the <part-of-day>", -5.598421958998375),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.345658990503007),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -4.68213122712422),
-                                    ("at <time-of-day>intersect", -5.19295685089021),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.598421958998375),
-                                    ("dayminute", -2.924273309571846),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.19295685089021),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.19295685089021),
-                                    ("<ordinal> <cycle> of <time>year", -5.598421958998375),
-                                    ("minuteday", -2.132686056198648),
-                                    ("absorption of , after named dayintersect",
-                                     -5.598421958998375),
-                                    ("Octoberyear", -4.345658990503007),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -5.598421958998375),
-                                    ("<day-of-month> (ordinal or number) <named-month>year",
-                                     -5.598421958998375),
-                                    ("year<time-of-day> am|pm", -5.598421958998375),
-                                    ("Septemberyear", -5.19295685089021),
-                                    ("at <time-of-day>on <date>", -4.499809670330265),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("Halloweenyear", -5.598421958998375),
-                                    ("dayweek", -5.598421958998375),
-                                    ("Thursday<time-of-day> am|pm", -5.598421958998375),
-                                    ("weekyear", -5.19295685089021),
-                                    ("hh:mmin|during the <part-of-day>", -4.90527477843843),
-                                    ("Father's Dayyear", -5.598421958998375),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.19295685089021),
-                                    ("February<time> <part-of-day>", -5.598421958998375),
-                                    ("Martin Luther King's Dayyear", -5.19295685089021),
-                                    ("tomorrowat <time-of-day>", -4.90527477843843),
-                                    ("between <time> and <time>on <date>", -4.90527477843843),
-                                    ("Thursdayfrom|since|after <time-of-day>", -4.90527477843843),
-                                    ("at <time-of-day>tomorrow", -5.19295685089021),
-                                    ("tomorrow<time-of-day> am|pm", -5.598421958998375),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -5.598421958998375),
-                                    ("Labor Dayyear", -5.598421958998375),
-                                    ("Februaryintersect", -5.598421958998375),
-                                    ("last <cycle> of <time>year", -4.90527477843843),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -5.598421958998375),
-                                    ("yearminute", -5.598421958998375),
-                                    ("Black Fridayyear", -5.19295685089021)],
-                               n = 201},
-                   koData =
-                     ClassData{prior = -0.9392802500988537, unseen = -5.983936280687191,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("in <named-month>year", -5.288267030694535),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.288267030694535),
-                                    ("hourday", -5.288267030694535),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.288267030694535),
-                                    ("dayhour", -2.890371757896165),
-                                    ("daymonth", -3.2088254890146994),
-                                    ("monthday", -4.882801922586371),
-                                    ("monthyear", -4.59511985013459),
-                                    ("intersecthh:mm", -5.288267030694535),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.288267030694535),
-                                    ("houryear", -5.288267030694535),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.288267030694535),
-                                    ("until <time-of-day><time-of-day> am|pm", -5.288267030694535),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.59511985013459),
-                                    ("<time-of-day> am|pmintersect", -4.035504062199167),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.37197629882038),
-                                    ("from|since|after <time-of-day>on <date>", -4.37197629882038),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("absorption of , after named dayJuly", -4.882801922586371),
-                                    ("monthhour", -5.288267030694535),
-                                    ("hourmonth", -4.59511985013459),
-                                    ("todayat <time-of-day>", -5.288267030694535),
-                                    ("from|since|after <time-of-day>July", -5.288267030694535),
-                                    ("dayday", -4.882801922586371),
-                                    ("mm/ddat <time-of-day>", -4.882801922586371),
-                                    ("<time-of-day> am|pmon <date>", -4.035504062199167),
-                                    ("dayyear", -4.035504062199167),
-                                    ("Thursdaymm/dd", -5.288267030694535),
-                                    ("Thursdayat <time-of-day>", -4.035504062199167),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.288267030694535),
-                                    ("monthminute", -5.288267030694535),
-                                    ("<time-of-day> am|pmtomorrow", -5.288267030694535),
-                                    ("Thursdayhh:mm", -4.37197629882038),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("Fridayyear", -4.882801922586371),
-                                    ("minutemonth", -3.4965075614664802),
-                                    ("Sundayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.882801922586371),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("Aprilyear", -5.288267030694535),
-                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.288267030694535),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.288267030694535),
-                                    ("yesterday<time-of-day> am|pm", -5.288267030694535),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -4.37197629882038),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.288267030694535),
-                                    ("until <time-of-day>on <date>", -4.59511985013459),
-                                    ("at <time-of-day>intersect", -4.882801922586371),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("dayminute", -2.7625383863862796),
-                                    ("intersectSeptember", -3.784189633918261),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("minuteday", -2.3704962986102562),
-                                    ("absorption of , after named dayintersect",
-                                     -5.288267030694535),
-                                    ("Februaryin|during the <part-of-day>", -5.288267030694535),
-                                    ("week-endin <named-month>", -5.288267030694535),
-                                    ("Octoberyear", -5.288267030694535),
-                                    ("from|since|after <time-of-day>year", -5.288267030694535),
-                                    ("yearhh:mm", -5.288267030694535),
-                                    ("hh:mmon <date>", -3.784189633918261),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -5.288267030694535),
-                                    ("absorption of , after named daySeptember", -4.37197629882038),
-                                    ("on <date>September", -4.882801922586371),
-                                    ("at <time-of-day>on <date>", -4.882801922586371),
-                                    ("dayweek", -5.288267030694535),
-                                    ("Thursday<time-of-day> am|pm", -4.882801922586371),
-                                    ("absorption of , after named dayFebruary", -4.37197629882038),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.288267030694535),
-                                    ("tomorrowat <time-of-day>", -5.288267030694535),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.288267030694535),
-                                    ("Thursdayfrom|since|after <time-of-day>", -3.6788291182604347),
-                                    ("tomorrow<time-of-day> am|pm", -5.288267030694535),
-                                    ("Tuesdayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("yearminute", -5.288267030694535)],
-                               n = 129}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.16251892949777494),
-                                    ("integer (0..19)", -1.8971199848858813)],
-                               n = 18}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.0149030205422647),
-                                    ("quarteryear", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.0149030205422647),
-                                    ("weekmonth", -1.6094379124341003),
-                                    ("ordinal (digits)quarter (grain)year", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)past year (latent)",
-                                     -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd/yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>integer (numeric)",
-                                     -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 1}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.9808292530117262),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -2.0794415416798357),
-                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
-                                     -1.6739764335716716),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
-                                     -1.6739764335716716)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.0986122886681098),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
-                                     -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
-                                     -1.3862943611198906)],
-                               n = 3}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.6094379124341003),
-                                    ("hourday", -0.916290731874155),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -1.6094379124341003),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("past year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15822400521489416,
-                               unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5488132906176655),
-                                    ("month (grain)", -2.995732273553991),
-                                    ("year (grain)", -1.817077277212345),
-                                    ("week (grain)", -1.5488132906176655),
-                                    ("quarter", -2.772588722239781), ("year", -1.817077277212345),
-                                    ("month", -2.995732273553991),
-                                    ("quarter (grain)", -2.772588722239781)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -1.9218125974762528,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.4816045409242156),
-                                    ("week (grain)", -1.4816045409242156),
-                                    ("day", -1.9924301646902063),
-                                    ("day (grain)", -1.9924301646902063)],
-                               n = 6}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -2.1972245773362196),
-                                    ("end of month", -2.1972245773362196),
-                                    ("time-of-day (latent)", -2.1972245773362196),
-                                    ("<time-of-day> am|pm", -2.1972245773362196),
-                                    ("hh:mm", -2.1972245773362196), ("hour", -1.791759469228055),
-                                    ("month", -2.1972245773362196), ("minute", -1.791759469228055)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2006706954621511,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.7047480922384253,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("ordinal (digits)", -0.2876820724517809)],
-                               n = 2}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.5315058290035293,
-                               unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.12136085700426748),
-                                    ("integer (0..19)", -2.3025850929940455)],
-                               n = 67},
-                   koData =
-                     ClassData{prior = -0.8860508466844369,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.10536051565782628),
-                                    ("integer (0..19)", -2.8134107167600364),
-                                    ("integer 21..99", -3.2188758248682006)],
-                               n = 47}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.23483959107740107, unseen = -3.58351893845611,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -1.563975538357343, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 9}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.1479201300766222,
-                               unseen = -5.0875963352323845,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4423470353692043),
-                                    ("integer (0..19)year (grain)", -3.289644895756408),
-                                    ("integer (numeric)day (grain)", -2.6835090921860925),
-                                    ("integer (0..19)second (grain) ", -3.6951100038645723),
-                                    ("integer (0..19)hour (grain)", -3.001962823304627),
-                                    ("second", -3.289644895756408),
-                                    ("integer (numeric)second (grain) ", -3.982792076316353),
-                                    ("integer (numeric)year (grain)", -3.6951100038645723),
-                                    ("day", -2.4423470353692043), ("year", -2.8841797876482436),
-                                    ("integer (numeric)week (grain)", -3.001962823304627),
-                                    ("integer (0..19)month (grain)", -3.4719664525503626),
-                                    ("hour", -2.5964977151964628), ("month", -3.1354942159291497),
-                                    ("integer (numeric)minute (grain)", -3.1354942159291497),
-                                    ("integer (0..19)minute (grain)", -3.001962823304627),
-                                    ("integer (numeric)month (grain)", -3.982792076316353),
-                                    ("minute", -2.4423470353692043),
-                                    ("integer (numeric)hour (grain)", -3.4719664525503626),
-                                    ("integer (0..19)day (grain)", -3.6951100038645723),
-                                    ("integer (0..19)week (grain)", -3.1354942159291497)],
-                               n = 69},
-                   koData =
-                     ClassData{prior = -1.984131361875511, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2929871246814741,
-                               unseen = -5.3230099791384085,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer after|past <hour-of-day>", -3.9318256327243257),
-                                    ("at <time-of-day>", -2.2270775404859005),
-                                    ("from|since|after <time-of-day>", -3.708682081410116),
-                                    ("<time-of-day> o'clock", -4.219507705176107),
-                                    ("half after|past <hour-of-day>", -4.219507705176107),
-                                    ("time-of-day (latent)", -1.7346010553881064),
-                                    ("hhmm (latent)", -4.624972813284271),
-                                    ("hh:mm", -2.2735975561207935),
-                                    ("quarter after|past <hour-of-day>", -4.624972813284271),
-                                    ("about|exactly <time-of-day>", -4.624972813284271),
-                                    ("until <time-of-day>", -3.9318256327243257),
-                                    ("hour", -1.2237754316221157),
-                                    ("<time-of-day> sharp|exactly", -4.624972813284271),
-                                    ("minute", -1.7346010553881064)],
-                               n = 94},
-                   koData =
-                     ClassData{prior = -1.3705460041517514, unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
-                                    ("from|since|after <time-of-day>", -3.283414346005772),
-                                    ("<hour-of-day> <integer>", -3.6888794541139363),
-                                    ("time-of-day (latent)", -1.0498221244986778),
-                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
-                               n = 32}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5753641449035618,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("year (grain)", -2.772588722239781),
-                                    ("second", -2.772588722239781),
-                                    ("week (grain)", -2.0794415416798357),
-                                    ("day", -2.0794415416798357),
-                                    ("minute (grain)", -2.772588722239781),
-                                    ("year", -2.772588722239781),
-                                    ("second (grain) ", -2.772588722239781),
-                                    ("minute", -2.772588722239781),
-                                    ("day (grain)", -2.0794415416798357)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.8266785731844679, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -6.782259633876106e-2,
-                               unseen = -4.07753744390572,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 57},
-                   koData =
-                     ClassData{prior = -2.7245795030534206, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.639057329615259),
-                                    ("this|last|next <cycle>", -2.639057329615259),
-                                    ("day", -2.2335922215070942),
-                                    ("time-of-day (latent)", -2.639057329615259),
-                                    ("hhmm (latent)", -2.2335922215070942),
-                                    ("<time-of-day> am|pm", -2.639057329615259),
-                                    ("hour", -1.9459101490553135),
-                                    ("next <time>", -2.639057329615259),
-                                    ("this|next <day-of-week>", -2.639057329615259),
-                                    ("minute", -2.2335922215070942)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.48130318449966897,
-                               unseen = -5.170483995038151,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayhour", -3.2188758248682006),
-                                    ("daymonth", -3.2188758248682006),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.471638793363569),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.7784916128036232),
-                                    ("Wednesdayintersect", -4.471638793363569),
-                                    ("Labor Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Black Fridaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.471638793363569),
-                                    ("<part-of-day> of <time>February", -4.471638793363569),
-                                    ("Saturday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -4.471638793363569),
-                                    ("on <date><time-of-day> am|pm", -4.471638793363569),
-                                    ("hourmonth", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.471638793363569),
-                                    ("dayday", -2.5998366164619773),
-                                    ("the <day-of-month> (ordinal)February", -4.0661736852554045),
-                                    ("WednesdayOctober", -4.471638793363569),
-                                    ("Wednesdaythis|last|next <cycle>", -4.0661736852554045),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.5553480614894135),
-                                    ("dayyear", -2.8622008809294686),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.471638793363569),
-                                    ("Thursdayhh:mm", -4.0661736852554045),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Memorial Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("TuesdayOctober", -4.471638793363569),
-                                    ("the <day-of-month> (ordinal)March", -4.471638793363569),
-                                    ("Mondaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.0661736852554045),
-                                    ("Fridayintersect", -4.471638793363569),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.7784916128036232),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.5553480614894135),
-                                    ("Tuesdaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayminute", -2.6798793241355137),
-                                    ("intersectyear", -4.471638793363569),
-                                    ("minuteday", -3.5553480614894135),
-                                    ("this|last|next <cycle>Sunday", -4.471638793363569),
-                                    ("Sundaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersectintersect", -4.471638793363569),
-                                    ("weekday", -4.471638793363569),
-                                    ("dayweek", -3.373026504695459),
-                                    ("Thursday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -4.0661736852554045)],
-                               n = 55},
-                   koData =
-                     ClassData{prior = -0.9622758451159785, unseen = -4.897839799950911,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.197201947661808),
-                                    ("week-endOctober", -3.5040547671018634),
-                                    ("daymonth", -1.9999773703255892),
-                                    ("TuesdaySeptember", -4.197201947661808),
-                                    ("Wednesdayintersect", -4.197201947661808),
-                                    ("hourmonth", -3.0985896589936988),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.197201947661808),
-                                    ("Fridaythis|last|next <cycle>", -4.197201947661808),
-                                    ("SundayFebruary", -4.197201947661808),
-                                    ("WednesdayOctober", -4.197201947661808),
-                                    ("week-endintersect", -4.197201947661808),
-                                    ("dayyear", -4.197201947661808),
-                                    ("FridayJuly", -3.791736839553644),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.197201947661808),
-                                    ("FridaySeptember", -4.197201947661808),
-                                    ("WednesdayFebruary", -4.197201947661808),
-                                    ("minutemonth", -3.2809112157876537),
-                                    ("SundayMarch", -4.197201947661808),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.197201947661808),
-                                    ("MondayFebruary", -3.791736839553644),
-                                    ("Fridayintersect", -4.197201947661808),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.791736839553644),
-                                    ("dayminute", -2.810907586541918),
-                                    ("SaturdaySeptember", -4.197201947661808),
-                                    ("intersectSeptember", -3.2809112157876537),
-                                    ("MondayMarch", -4.197201947661808),
-                                    ("on <date>September", -3.791736839553644),
-                                    ("intersectintersect", -4.197201947661808),
-                                    ("Tuesdayintersect", -4.197201947661808),
-                                    ("Sundayintersect", -4.197201947661808)],
-                               n = 34}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6286086594223742, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.6026896854443837),
-                                    ("Martin Luther King's Day", -2.6026896854443837),
-                                    ("Memorial Day", -2.6026896854443837),
-                                    ("Mother's Day", -2.6026896854443837),
-                                    ("day", -1.2163953243244932), ("Sunday", -2.6026896854443837),
-                                    ("Thanksgiving Day", -2.6026896854443837),
-                                    ("hour", -2.6026896854443837), ("Tuesday", -2.6026896854443837),
-                                    ("week-end", -2.6026896854443837)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.7621400520468967, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.5257286443082556), ("day", -2.120263536200091),
-                                    ("Sunday", -2.5257286443082556), ("hour", -1.4271163556401458),
-                                    ("week-end", -1.4271163556401458)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time-of-day>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Labor Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -2.3025850929940455),
-                                    ("<time-of-day> am|pm", -1.6094379124341003),
-                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
-                                    ("minute", -1.3862943611198906)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.7227665977411035),
-                                    ("yesterday", -2.2335922215070942),
-                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
-                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
-                               n = 10}}),
-       ("mm.dd.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.70805020110221),
-                                    ("a <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>today", -2.70805020110221),
-                                    ("daysecond", -2.70805020110221),
-                                    ("a <unit-of-duration>right now", -2.70805020110221),
-                                    ("minutenograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("secondnograin", -2.70805020110221),
-                                    ("yearday", -2.0149030205422647),
-                                    ("daynograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>now", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.3978952727983707),
-                                    ("dayday", -1.9924301646902063),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.3978952727983707)],
-                               n = 3}}),
-       ("Independence Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.803360380906535),
-                                    ("Halloween", -2.803360380906535),
-                                    ("Wednesday", -2.803360380906535),
-                                    ("Memorial Day", -2.803360380906535),
-                                    ("Monday", -2.803360380906535),
-                                    ("Mother's Day", -2.803360380906535),
-                                    ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.803360380906535),
-                                    ("March", -2.803360380906535), ("month", -2.803360380906535),
-                                    ("Tuesday", -2.1102132003465894)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> before last|after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -1.8718021769015913),
-                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
-                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by the end of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("this|last|next <cycle>", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hhmm (military) am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.1918471524802814),
-                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
-                                    ("minuteminute", -1.457246097092175),
-                                    ("hh:mmhh:mm", -2.093234863812172),
-                                    ("dayday", -3.1918471524802814),
-                                    ("hourhour", -2.093234863812172),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
-                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.1135153092103742),
-                                    ("daymonth", -2.70805020110221),
-                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
-                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
-                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
-                                    ("minuteminute", -1.8607523407150064),
-                                    ("hourhour", -2.70805020110221),
-                                    ("minutehour", -2.70805020110221),
-                                    ("hh:mmintersect", -2.1972245773362196),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.1135153092103742),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.1135153092103742)],
-                               n = 12}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.252762968495368), ("March", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.8472978603872037),
-                                    ("month", -0.8472978603872037)],
-                               n = 2}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.529395204760564),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -2.4849066497880004),
-                                    ("hourhour", -1.6964492894237302),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
-                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
-                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
-                                    ("hourhour", -2.2129729343043585),
-                                    ("minutehour", -1.2144441041932315),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.4657359027997265),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -2.5494451709255714),
-                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.0602707946915624)],
-                               n = 24}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time-of-day>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 33},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.791759469228055),
-                                    ("daymonth", -1.2809338454620642),
-                                    ("day (grain)intersect", -1.791759469228055),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("week (grain)intersect", -2.1972245773362196),
-                                    ("week (grain)September", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Labor Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0116009116784799),
-                                    ("hh:mmhh:mm", -1.0116009116784799)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.4469189829363254),
-                                    ("minuteminute", -1.4469189829363254),
-                                    ("minutehour", -1.4469189829363254),
-                                    ("hh:mmintersect", -1.4469189829363254)],
-                               n = 6}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -4.0821994520255166e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -3.2188758248682006,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.5257286443082556),
-                                    ("Martin Luther King's Day", -2.5257286443082556),
-                                    ("Monday", -2.5257286443082556), ("day", -1.1394342831883648),
-                                    ("Thanksgiving Day", -2.5257286443082556),
-                                    ("hour", -2.5257286443082556), ("winter", -2.5257286443082556),
-                                    ("week-end", -2.5257286443082556),
-                                    ("summer", -2.120263536200091)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
+      [("Bhai Dooj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7537718023763802),
+                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
+                               n = 7}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.824549292051046),
+                                    ("<time-of-day> am|pm", -1.6422277352570913),
+                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
+                                    ("minute", -1.824549292051046)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6142532380902823, unseen = -5.676753802268282,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 290},
+                   koData =
+                     ClassData{prior = -0.7788026251384392,
+                               unseen = -5.5134287461649825,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 246}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
+                                    ("year", -2.662587827025453),
+                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
+                                    ("a <unit-of-duration>", -2.662587827025453),
+                                    ("month", -2.662587827025453),
+                                    ("fortnight", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.5040773967762742),
+                                    ("<integer> <unit-of-duration>", -1.5040773967762742)],
+                               n = 1}}),
+       ("noon|midnight|EOD|end of day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Father's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8109302162163288),
+                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
+                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)December", -2.1400661634962708),
+                                    ("ordinal (digits)February", -2.1400661634962708),
+                                    ("integer (numeric)April", -2.1400661634962708),
+                                    ("month", -1.4469189829363254)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.6741486494265287),
+                                    ("ordinal (digits)July", -2.6741486494265287),
+                                    ("integer (numeric)September", -2.268683541318364),
+                                    ("ordinal (digits)August", -2.6741486494265287),
+                                    ("integer (numeric)August", -2.6741486494265287),
+                                    ("ordinal (digits)April", -2.6741486494265287),
+                                    ("month", -1.0647107369924282),
+                                    ("integer (numeric)July", -2.268683541318364)],
+                               n = 9}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.48863636973214,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("dayhour", -1.4816045409242156),
+                                    ("Mondayearly morning", -3.378724525810097),
+                                    ("time-of-day (latent)tonight", -3.378724525810097),
+                                    ("hourhour", -2.3978952727983707),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("todaypart of days", -3.784189633918261),
+                                    ("minutehour", -2.6855773452501515),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.378724525810097),
+                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
+                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
+                                    ("intersectpart of days", -3.784189633918261),
+                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("tomorrowpart of days", -2.3978952727983707),
+                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("yesterdaypart of days", -3.378724525810097),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("Mondaypart of days", -3.784189633918261)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.772588722239781),
+                                    ("monthhour", -2.772588722239781),
+                                    ("hourhour", -2.772588722239781),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -2.772588722239781),
+                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.772588722239781)],
+                               n = 3}}),
+       ("today",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mm/dd",
+        Classifier{okData =
+                     ClassData{prior = -1.2729656758128873,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.3285040669720361, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.961215868968717e-2,
+                               unseen = -4.948759890378168,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.8430301339411947),
+                                    ("noon|midnight|EOD|end of day", -3.8430301339411947),
+                                    ("integer after|past <hour-of-day>", -3.8430301339411947),
+                                    ("half after|past <hour-of-day>", -4.248495242049359),
+                                    ("time-of-day (latent)", -1.6835458845878222),
+                                    ("hhmm (latent)", -3.5553480614894135),
+                                    ("<time-of-day> am|pm", -1.8061482066801546),
+                                    ("hh:mm", -3.332204510175204),
+                                    ("about|exactly <time-of-day>", -3.8430301339411947),
+                                    ("hour", -1.0704414117014134),
+                                    ("<time-of-day> sharp|exactly", -4.248495242049359),
+                                    ("minute", -2.05127066471314)],
+                               n = 64},
+                   koData =
+                     ClassData{prior = -2.456735772821304, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.2321436812926323),
+                                    ("hour", -1.2321436812926323)],
+                               n = 6}}),
+       ("December",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -2.1972245773362196),
+                                    ("Wednesday", -2.6026896854443837),
+                                    ("Saturday", -2.6026896854443837),
+                                    ("Monday", -2.1972245773362196),
+                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
+                                    ("Sunday", -2.6026896854443837)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("tonight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the ides of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.4816045409242156),
+                                    ("mm/dd", -3.4965075614664802),
+                                    ("absorption of , after named day", -3.0910424533583156),
+                                    ("intersect", -3.0910424533583156),
+                                    ("Saturday", -2.803360380906535),
+                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
+                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.803360380906535),
+                                    ("hour", -3.4965075614664802)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.791759469228055)],
+                               n = 4}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.11122563511022437,
+                               unseen = -3.970291913552122,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 51},
+                   koData =
+                     ClassData{prior = -2.2512917986064953,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.7884573603642702),
+                                    ("hh:mmhh:mm", -0.7884573603642702)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
+                                    ("minutehour", -0.7884573603642702)],
+                               n = 9}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("October",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from|since|after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.5950491749820006, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July", -3.332204510175204),
+                                    ("time-of-day (latent)", -2.4159137783010487),
+                                    ("<time-of-day> am|pm", -2.4159137783010487),
+                                    ("hh:mm", -2.4159137783010487), ("hour", -1.8281271133989299),
+                                    ("month", -2.9267394020670396), ("minute", -2.4159137783010487),
+                                    ("August", -3.332204510175204)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.22677331936478848,
+                               unseen = -4.9344739331306915,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.828641396489095),
+                                    ("week", -4.23410650459726),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.23410650459726),
+                                    ("today", -4.23410650459726), ("intersect", -2.362304327695668),
+                                    ("second", -4.23410650459726), ("now", -3.5409593240373143),
+                                    ("tomorrow", -3.828641396489095),
+                                    ("this|last|next <cycle>", -4.23410650459726),
+                                    ("day", -1.8827312474337816),
+                                    ("time-of-day (latent)", -4.23410650459726),
+                                    ("<time-of-day> am|pm", -3.828641396489095),
+                                    ("nograin", -3.5409593240373143),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.23410650459726),
+                                    ("Easter Sunday", -4.23410650459726),
+                                    ("Christmas", -3.5409593240373143),
+                                    ("hour", -2.981343536101891), ("month", -4.23410650459726),
+                                    ("<datetime> - <datetime> (interval)", -2.847812143477369),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.5293584123588344),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -3.828641396489095),
+                                    ("minute", -1.749199854809259),
+                                    ("right now", -4.23410650459726),
+                                    ("<month> dd-dd (interval)", -3.5409593240373143),
+                                    ("dd-dd <month> (interval)", -3.828641396489095)],
+                               n = 55}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> more <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.11000089521432846,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.248434627109745),
+                                    ("<integer> more <unit-of-duration>", -3.9415818076696905),
+                                    ("three-quarters of an hour", -3.0252910757955354),
+                                    ("<integer> + '\"", -3.248434627109745),
+                                    ("number.number hours", -3.9415818076696905),
+                                    ("second", -3.536116699561526), ("day", -3.248434627109745),
+                                    ("half an hour", -3.0252910757955354),
+                                    ("year", -3.9415818076696905),
+                                    ("<integer> <unit-of-duration>", -1.5902065505062128),
+                                    ("a <unit-of-duration>", -3.0252910757955354),
+                                    ("quarter of an hour", -3.0252910757955354),
+                                    ("hour", -2.5552874465498),
+                                    ("about|exactly <duration>", -3.9415818076696905),
+                                    ("<integer> and an half hour", -3.9415818076696905),
+                                    ("minute", -1.3025244780544318)],
+                               n = 43},
+                   koData =
+                     ClassData{prior = -2.2617630984737906, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -2.1972245773362196), ("year", -1.9095425048844386),
+                                    ("<integer> <unit-of-duration>", -1.9095425048844386),
+                                    ("a <unit-of-duration>", -2.1972245773362196)],
+                               n = 5}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half <integer> (UK style hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Family Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8209805520698302,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vimy Ridge Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -0.6931471805599453),
+                                    ("Diwali<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.44339892331178415,
+                               unseen = -6.7464121285733745,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.052089168924417),
+                                    ("Father's Dayyear (latent)", -6.052089168924417),
+                                    ("Ramadanyear (latent)", -6.052089168924417),
+                                    ("<datetime> - <datetime> (interval)on <date>",
+                                     -4.799326200429049),
+                                    ("Bhai Doojyear (latent)", -6.052089168924417),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.799326200429049),
+                                    ("hourday", -4.347341076685992),
+                                    ("dayhour", -3.134318436840138),
+                                    ("Martin Luther King's Dayyear (latent)", -5.646624060816253),
+                                    ("Shemini Atzeretyear (latent)", -6.052089168924417),
+                                    ("daymonth", -5.358941988364472),
+                                    ("monthday", -5.646624060816253),
+                                    ("monthyear", -4.442651256490317),
+                                    ("Yom Ha'atzmautyear (latent)", -6.052089168924417),
+                                    ("Vijayadashamiyear (latent)", -6.052089168924417),
+                                    ("Thanksgiving Dayyear (latent)", -4.953476880256307),
+                                    ("Thai Pongalyear (latent)", -5.358941988364472),
+                                    ("Thiru Onamyear (latent)", -5.358941988364472),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.052089168924417),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -6.052089168924417),
+                                    ("houryear", -5.358941988364472),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.052089168924417),
+                                    ("Christmas<time-of-day> am|pm", -6.052089168924417),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.052089168924417),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.358941988364472),
+                                    ("<time-of-day> am|pmintersect", -4.799326200429049),
+                                    ("Family Dayyear (latent)", -5.135798437050262),
+                                    ("Octoberyear (latent)", -4.799326200429049),
+                                    ("intersect<time-of-day> am|pm", -6.052089168924417),
+                                    ("Mattu Pongalyear (latent)", -6.052089168924417),
+                                    ("Shavuotyear (latent)", -6.052089168924417),
+                                    ("Dhanterasin <named-month>|year", -6.052089168924417),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.052089168924417),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.052089168924417),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.646624060816253),
+                                    ("Marchyear (latent)", -6.052089168924417),
+                                    ("Sukkotyear (latent)", -5.646624060816253),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.052089168924417),
+                                    ("Clean Mondayyear (latent)", -5.646624060816253),
+                                    ("monthhour", -5.646624060816253),
+                                    ("todayat <time-of-day>", -6.052089168924417),
+                                    ("Thursday<time> timezone", -4.347341076685992),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.052089168924417),
+                                    ("Palm SundaySunday", -5.646624060816253),
+                                    ("dayday", -3.8548645915881976),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.052089168924417),
+                                    ("mm/ddat <time-of-day>", -6.052089168924417),
+                                    ("tonightat <time-of-day>", -6.052089168924417),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.358941988364472),
+                                    ("today<time-of-day> am|pm", -6.052089168924417),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.646624060816253),
+                                    ("at <time-of-day><time> <part-of-day>", -6.052089168924417),
+                                    ("mm/dd<time-of-day> am|pm", -6.052089168924417),
+                                    ("hourhour", -4.799326200429049),
+                                    ("<time-of-day> am|pmon <date>", -4.037186148382152),
+                                    ("National Patriots' Dayyear (latent)", -5.358941988364472),
+                                    ("Wednesdaythis|last|next <cycle>", -6.052089168924417),
+                                    ("Lentyear (latent)", -6.052089168924417),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.548011772148143),
+                                    ("Boghiyear (latent)", -6.052089168924417),
+                                    ("dayyear", -1.9330519941119446),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.052089168924417),
+                                    ("Thursdayat <time-of-day>", -5.646624060816253),
+                                    ("Islamic New Yearyear (latent)", -5.646624060816253),
+                                    ("Laylat al-Qadryear (latent)", -5.135798437050262),
+                                    ("Chhathin <named-month>|year", -6.052089168924417),
+                                    ("Vasant Panchamiin <named-month>|year", -6.052089168924417),
+                                    ("Diwaliin <named-month>|year", -6.052089168924417),
+                                    ("Discovery Dayyear (latent)", -5.646624060816253),
+                                    ("Shrove Tuesdayyear (latent)", -6.052089168924417),
+                                    ("<time-of-day> am|pmtomorrow", -5.358941988364472),
+                                    ("Yom Kippuryear (latent)", -6.052089168924417),
+                                    ("<part-of-day> of <time>year (latent)", -6.052089168924417),
+                                    ("minutehour", -5.135798437050262),
+                                    ("Kaanum Pongalyear (latent)", -5.646624060816253),
+                                    ("Maha Saptamiyear (latent)", -6.052089168924417),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.646624060816253),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.347341076685992),
+                                    ("for <duration> from <time>December", -6.052089168924417),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.052089168924417),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.135798437050262),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.646624060816253),
+                                    ("Pentecostyear (latent)", -6.052089168924417),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.135798437050262),
+                                    ("Eid al-Fitryear (latent)", -6.052089168924417),
+                                    ("Mondayin|during the <part-of-day>", -6.052089168924417),
+                                    ("Raksha Bandhanyear (latent)", -6.052089168924417),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.646624060816253),
+                                    ("Navaratriin <named-month>|year", -6.052089168924417),
+                                    ("Ashurayear (latent)", -6.052089168924417),
+                                    ("Chinese New Yearyear (latent)", -6.052089168924417),
+                                    ("Sundayyear (latent)", -6.052089168924417),
+                                    ("Lag BaOmeryear (latent)", -6.052089168924417),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.052089168924417),
+                                    ("Eid al-Adhayear (latent)", -5.135798437050262),
+                                    ("intersectin|during the <part-of-day>", -6.052089168924417),
+                                    ("Christmasat <time-of-day>", -6.052089168924417),
+                                    ("Passoveryear (latent)", -6.052089168924417),
+                                    ("Lazarus Saturdayyear (latent)", -6.052089168924417),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.052089168924417),
+                                    ("Yom HaShoahyear (latent)", -5.646624060816253),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -5.135798437050262),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.052089168924417),
+                                    ("Thai Pongalin <named-month>|year", -6.052089168924417),
+                                    ("Septemberyear (latent)", -5.646624060816253),
+                                    ("mm/ddyear (latent)", -6.052089168924417),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -4.799326200429049),
+                                    ("Halloweenyear (latent)", -6.052089168924417),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.358941988364472),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -5.135798437050262),
+                                    ("at <time-of-day>intersect", -5.646624060816253),
+                                    ("Rosh Hashanahyear (latent)", -6.052089168924417),
+                                    ("Dhanterasyear (latent)", -6.052089168924417),
+                                    ("Tu BiShvatyear (latent)", -6.052089168924417),
+                                    ("Holiyear (latent)", -5.358941988364472),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.052089168924417),
+                                    ("Holika Dahanyear (latent)", -5.358941988364472),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.052089168924417),
+                                    ("dayminute", -3.4130318393091583),
+                                    ("Mawlidyear (latent)", -6.052089168924417),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.646624060816253),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.052089168924417),
+                                    ("Jumu'atul-Widayear (latent)", -5.135798437050262),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.052089168924417),
+                                    ("minuteday", -2.414503009198031),
+                                    ("absorption of , after named dayintersect",
+                                     -6.052089168924417),
+                                    ("intersectyear (latent)", -6.052089168924417),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.052089168924417),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.052089168924417),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.052089168924417),
+                                    ("Boss's Dayyear (latent)", -5.646624060816253),
+                                    ("Tisha B'Avyear (latent)", -6.052089168924417),
+                                    ("Isra and Mi'rajyear (latent)", -5.135798437050262),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.052089168924417),
+                                    ("Christmasyear (latent)", -5.646624060816253),
+                                    ("Naraka Chaturdashiyear (latent)", -5.646624060816253),
+                                    ("at <time-of-day>on <date>", -4.953476880256307),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.442651256490317),
+                                    ("dayweek", -6.052089168924417),
+                                    ("Easter Sundayyear (latent)", -5.358941988364472),
+                                    ("Thursday<time-of-day> am|pm", -6.052089168924417),
+                                    ("Labour Dayyear (latent)", -6.052089168924417),
+                                    ("weekyear", -5.646624060816253),
+                                    ("hh:mmin|during the <part-of-day>", -5.358941988364472),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.646624060816253),
+                                    ("Hanukkahyear (latent)", -6.052089168924417),
+                                    ("February<time> <part-of-day>", -6.052089168924417),
+                                    ("Tuesdayin <named-month>|year", -6.052089168924417),
+                                    ("Great Lentyear (latent)", -6.052089168924417),
+                                    ("tomorrowat <time-of-day>", -5.358941988364472),
+                                    ("between <time> and <time>on <date>", -4.442651256490317),
+                                    ("Thursdayfrom|since|after <time-of-day>", -5.358941988364472),
+                                    ("last <cycle> of <time>year (latent)", -5.358941988364472),
+                                    ("at <time-of-day>tomorrow", -5.646624060816253),
+                                    ("tomorrow<time-of-day> am|pm", -6.052089168924417),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.052089168924417),
+                                    ("Diwaliyear (latent)", -6.052089168924417),
+                                    ("Black Fridayyear (latent)", -5.646624060816253),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.052089168924417),
+                                    ("Chhathyear (latent)", -5.646624060816253),
+                                    ("Vasant Panchamiyear (latent)", -6.052089168924417),
+                                    ("Palm Sundayintersect", -6.052089168924417),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.052089168924417),
+                                    ("Februaryintersect", -6.052089168924417),
+                                    ("Mother's Dayyear (latent)", -6.052089168924417),
+                                    ("Simchat Torahyear (latent)", -6.052089168924417),
+                                    ("Victoria Dayyear (latent)", -5.646624060816253)],
+                               n = 319},
+                   koData =
+                     ClassData{prior = -1.0268064758045434, unseen = -6.343880434126331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.648974238161206),
+                                    ("hourday", -5.648974238161206),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.648974238161206),
+                                    ("dayhour", -3.2066272027920015),
+                                    ("daymonth", -3.56953269648137),
+                                    ("monthday", -5.243509130053042),
+                                    ("monthyear", -4.396211269665838),
+                                    ("<time-of-day> am|pmyear (latent)", -5.243509130053042),
+                                    ("Thai Pongalyear (latent)", -4.955827057601261),
+                                    ("intersecthh:mm", -5.648974238161206),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.648974238161206),
+                                    ("houryear", -4.732683506287051),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.648974238161206),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.648974238161206),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.955827057601261),
+                                    ("<time-of-day> am|pmintersect", -4.396211269665838),
+                                    ("Octoberyear (latent)", -5.648974238161206),
+                                    ("from|since|after <time-of-day>year (latent)",
+                                     -4.396211269665838),
+                                    ("from|since|after <time-of-day>on <date>", -4.732683506287051),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.648974238161206),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.396211269665838),
+                                    ("about|exactly <time-of-day>year (latent)",
+                                     -5.648974238161206),
+                                    ("absorption of , after named dayJuly", -5.243509130053042),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.732683506287051),
+                                    ("Clean Mondayyear (latent)", -5.648974238161206),
+                                    ("monthhour", -5.648974238161206),
+                                    ("hourmonth", -4.955827057601261),
+                                    ("todayat <time-of-day>", -5.648974238161206),
+                                    ("from|since|after <time-of-day>July", -5.648974238161206),
+                                    ("Mondayyear (latent)", -4.955827057601261),
+                                    ("dayday", -5.243509130053042),
+                                    ("mm/ddat <time-of-day>", -5.243509130053042),
+                                    ("<time-of-day> am|pmon <date>", -4.396211269665838),
+                                    ("dayyear", -2.678559772591505),
+                                    ("Thursdaymm/dd", -5.648974238161206),
+                                    ("New Year's Dayyear (latent)", -5.243509130053042),
+                                    ("Thursdayat <time-of-day>", -4.396211269665838),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.648974238161206),
+                                    ("Aprilyear (latent)", -5.648974238161206),
+                                    ("monthminute", -5.648974238161206),
+                                    ("<time-of-day> am|pmtomorrow", -5.648974238161206),
+                                    ("Thursdayhh:mm", -4.732683506287051),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.648974238161206),
+                                    ("minutemonth", -3.857214768933151),
+                                    ("Sundayfrom|since|after <time-of-day>", -5.648974238161206),
+                                    ("week-endin <named-month>|year", -5.648974238161206),
+                                    ("Augustyear (latent)", -5.243509130053042),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.243509130053042),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.243509130053042),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.243509130053042),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.648974238161206),
+                                    ("Sundayyear (latent)", -4.955827057601261),
+                                    ("Christmasat <time-of-day>", -5.648974238161206),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.648974238161206),
+                                    ("yesterday<time-of-day> am|pm", -5.648974238161206),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.732683506287051),
+                                    ("mm/ddyear (latent)", -5.648974238161206),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.243509130053042),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.648974238161206),
+                                    ("until <time-of-day>on <date>", -4.955827057601261),
+                                    ("at <time-of-day>intersect", -5.243509130053042),
+                                    ("hh:mmyear (latent)", -4.550361949493096),
+                                    ("Holiyear (latent)", -5.648974238161206),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.648974238161206),
+                                    ("dayminute", -3.164067588373206),
+                                    ("intersectSeptember", -4.144896841384932),
+                                    ("minuteday", -2.580921303027589),
+                                    ("absorption of , after named dayintersect",
+                                     -5.648974238161206),
+                                    ("Februaryin|during the <part-of-day>", -5.648974238161206),
+                                    ("hh:mmon <date>", -3.634071217618941),
+                                    ("Saturdayyear (latent)", -5.648974238161206),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -5.648974238161206),
+                                    ("absorption of , after named daySeptember",
+                                     -4.732683506287051),
+                                    ("Naraka Chaturdashiyear (latent)", -5.648974238161206),
+                                    ("on <date>September", -5.243509130053042),
+                                    ("at <time-of-day>on <date>", -5.243509130053042),
+                                    ("in <named-month>|yearyear (latent)", -5.648974238161206),
+                                    ("dayweek", -5.648974238161206),
+                                    ("Easter Sundayyear (latent)", -5.243509130053042),
+                                    ("Thursday<time-of-day> am|pm", -5.243509130053042),
+                                    ("absorption of , after named dayFebruary", -4.732683506287051),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.648974238161206),
+                                    ("tomorrowat <time-of-day>", -5.648974238161206),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.648974238161206),
+                                    ("Thursdayfrom|since|after <time-of-day>", -4.039536325727106),
+                                    ("tomorrow<time-of-day> am|pm", -5.648974238161206),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -4.955827057601261),
+                                    ("Diwaliyear (latent)", -5.243509130053042),
+                                    ("Tuesdayfrom|since|after <time-of-day>", -5.648974238161206),
+                                    ("Fridayyear (latent)", -5.243509130053042),
+                                    ("minuteyear", -4.396211269665838)],
+                               n = 178}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.2039728043259361,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.19105523676270922),
+                                    ("integer (0..19)", -1.749199854809259)],
+                               n = 21}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.001480000210124),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("hh:mmhh:mm", -2.001480000210124),
+                                    ("dayday", -2.512305623976115),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
+                                    ("hourhour", -2.512305623976115),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.1986731175506815),
+                                    ("dayhour", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.1986731175506815),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -3.1986731175506815),
+                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
+                                    ("minuteminute", -2.793208009442517),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.793208009442517),
+                                    ("dayday", -3.1986731175506815),
+                                    ("hourhour", -2.505525936990736),
+                                    ("dayyear", -3.1986731175506815),
+                                    ("minutehour", -2.2823823856765264),
+                                    ("hh:mmintersect", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -3.1986731175506815)],
+                               n = 14}}),
+       ("Saturday",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekmonth", -1.7346010553881064),
+                                    ("week (grain)October", -1.7346010553881064),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekday", -1.2237754316221157)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6094379124341003),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("hourminute", -2.3025850929940455),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.70805020110221),
+                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.0149030205422647),
+                                    ("hourhour", -1.791759469228055),
+                                    ("minutehour", -1.6094379124341003),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
+                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
+                               n = 4}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.14892327639210656,
+                               unseen = -4.955827057601261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.348511193973878e-2),
+                                    ("intersect 2 numbers", -3.5624655292582776)],
+                               n = 137},
+                   koData =
+                     ClassData{prior = -1.9778617488619157, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3121863889661687),
+                                    ("negative numbers", -0.6190392084062235),
+                                    ("compose by multiplication", -1.8718021769015913)],
+                               n = 22}}),
+       ("mm/dd/yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Civic Holiday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Memorial Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Monday",
+        Classifier{okData =
+                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.2237754316221157,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm:ss",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Hanukkah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262),
+                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>integer (numeric)",
+                                     -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("Labour Day",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9808292530117262),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.0794415416798357),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -1.6739764335716716),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.3862943611198906)],
+                               n = 3}}),
+       ("Valentine's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Discovery Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.0821994520255166e-2,
+                               unseen = -4.304065093204169,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 72},
+                   koData =
+                     ClassData{prior = -3.2188758248682006,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.3513752571634776),
+                                    ("part of daysintersect", -2.3513752571634776),
+                                    ("hourday", -0.9650808960435872),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.3513752571634776),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.3513752571634776),
+                                    ("part of daysthis <time>", -2.3513752571634776),
+                                    ("part of daysChristmas", -1.9459101490553135)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.252762968495368),
+                                    ("one twenty two", -0.8472978603872037),
+                                    ("one eleven", -1.252762968495368)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.3513752571634776),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.3513752571634776),
+                                    ("ordinal (digits)February", -2.3513752571634776),
+                                    ("integer (numeric)February", -1.9459101490553135),
+                                    ("month", -0.9650808960435872),
+                                    ("ordinal (digits)March", -2.3513752571634776),
+                                    ("integer (numeric)July", -2.3513752571634776)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.5040773967762742),
+                                    ("month", -1.5040773967762742)],
+                               n = 1}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("The Twelfth",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3677247801253174,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.5257286443082556),
+                                    ("hour", -0.7339691750802004),
+                                    ("part of days", -0.8209805520698302)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Groundhog Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -7.503518594291408e-2,
+                               unseen = -5.10594547390058,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1295745142720766),
+                                    ("month (grain)", -2.797281334830153),
+                                    ("year (grain)", -2.5349170703626616),
+                                    ("week (grain)", -1.1295745142720766),
+                                    ("quarter", -3.4904285153900982), ("year", -2.5349170703626616),
+                                    ("month", -2.797281334830153),
+                                    ("quarter (grain)", -3.4904285153900982)],
+                               n = 77},
+                   koData =
+                     ClassData{prior = -2.627081138568543, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.4816045409242156),
+                                    ("week (grain)", -1.4816045409242156),
+                                    ("day", -1.9924301646902063),
+                                    ("day (grain)", -1.9924301646902063)],
+                               n = 6}}),
+       ("Mother's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Victoria Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.7047480922384253),
+                                    ("ordinal (digits)", -0.2006706954621511)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -0.916290731874155),
+                                    ("ordinal (digits)", -0.5108256237659907)],
+                               n = 3}}),
+       ("last weekend of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
+                                    ("month", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (number)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.262364264467491, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -1.466337068793427, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Chinese New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.5699145401359973, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.11778303565638351),
+                                    ("integer (0..19)", -2.330755969960742)],
+                               n = 69},
+                   koData =
+                     ClassData{prior = -0.8337291311811348, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.352605801082348e-2),
+                                    ("integer (0..19)", -2.9267394020670396),
+                                    ("integer 21..99", -3.332204510175204)],
+                               n = 53}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -1.6094379124341003),
+                                    ("MondayMarch", -1.6094379124341003),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.13858616328614667,
+                               unseen = -5.147494476813453,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5026062268874014),
+                                    ("integer (0..19)year (grain)", -3.062222014822824),
+                                    ("integer (numeric)day (grain)", -2.743768283704289),
+                                    ("integer (0..19)second (grain) ", -3.7553691953827695),
+                                    ("integer (0..19)hour (grain)", -3.062222014822824),
+                                    ("second", -3.349904087274605),
+                                    ("integer (numeric)second (grain) ", -4.04305126783455),
+                                    ("integer (numeric)year (grain)", -3.349904087274605),
+                                    ("day", -2.4336133554004498), ("year", -2.576714199041123),
+                                    ("integer (numeric)week (grain)", -3.062222014822824),
+                                    ("integer (0..19)month (grain)", -3.5322256440685593),
+                                    ("hour", -2.6567569067146595), ("month", -3.1957534074473464),
+                                    ("integer (numeric)minute (grain)", -3.1957534074473464),
+                                    ("integer (0..19)minute (grain)", -3.062222014822824),
+                                    ("integer (numeric)month (grain)", -4.04305126783455),
+                                    ("minute", -2.5026062268874014),
+                                    ("integer (numeric)hour (grain)", -3.5322256440685593),
+                                    ("integer (0..19)day (grain)", -3.5322256440685593),
+                                    ("integer (0..19)week (grain)", -3.1957534074473464)],
+                               n = 74},
+                   koData =
+                     ClassData{prior = -2.044755983691946, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
+                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
+                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
+                               n = 11}}),
+       ("hhmm (latent)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -5.342334251964811,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.951243718581427),
+                                    ("at <time-of-day>", -2.202043863772168),
+                                    ("from|since|after <time-of-day>", -3.7281001672672174),
+                                    ("<time-of-day> o'clock", -4.238925791033208),
+                                    ("half after|past <hour-of-day>", -4.238925791033208),
+                                    ("time-of-day (latent)", -1.7266201670570935),
+                                    ("hhmm (latent)", -4.6443908991413725),
+                                    ("hh:mm", -2.293015641977895),
+                                    ("quarter after|past <hour-of-day>", -4.6443908991413725),
+                                    ("about|exactly <time-of-day>", -4.6443908991413725),
+                                    ("until <time-of-day>", -3.951243718581427),
+                                    ("hour", -1.2104036946562264),
+                                    ("<time-of-day> sharp|exactly", -4.6443908991413725),
+                                    ("minute", -1.754019141245208)],
+                               n = 96},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -4.394449154672439,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
+                                    ("from|since|after <time-of-day>", -3.283414346005772),
+                                    ("<hour-of-day> <integer>", -3.6888794541139363),
+                                    ("time-of-day (latent)", -1.0498221244986778),
+                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
+                               n = 32}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
+                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
+                                    ("month", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thanksgiving Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1400661634962708),
+                                    ("year (grain)", -2.4277482359480516),
+                                    ("second", -2.833213344056216),
+                                    ("week (grain)", -2.1400661634962708),
+                                    ("day", -2.1400661634962708),
+                                    ("minute (grain)", -2.833213344056216),
+                                    ("year", -2.4277482359480516),
+                                    ("second (grain) ", -2.833213344056216),
+                                    ("minute", -2.833213344056216),
+                                    ("day (grain)", -2.1400661634962708)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.8873031950009028, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -1.7227665977411035),
+                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
+                                    ("quarter (grain)", -1.9459101490553135)],
+                               n = 7}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -0.6931471805599453),
+                                    ("year", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -5.6352936551131744e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
+                   koData =
+                     ClassData{prior = -2.9041650800285006, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Rosh Hashanah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -0.1941560144409575, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -1.7346010553881064,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.2992829841302609),
+                                    ("Marcha <unit-of-duration>", -1.7047480922384253),
+                                    ("March<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayyear", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.46262352194811296,
+                               unseen = -5.099866427824199,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.400603020246817),
+                                    ("dayhour", -3.147840051751449),
+                                    ("daymonth", -3.147840051751449),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.400603020246817),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.7074558396868715),
+                                    ("Wednesdayintersect", -4.400603020246817),
+                                    ("Black Fridaythis|last|next <cycle>", -4.400603020246817),
+                                    ("Labour Daythis|last|next <cycle>", -4.400603020246817),
+                                    ("<part-of-day> of <time>February", -4.400603020246817),
+                                    ("Saturday<time-of-day> am|pm", -4.400603020246817),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -3.9951379121386528),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.400603020246817),
+                                    ("on <date><time-of-day> am|pm", -4.400603020246817),
+                                    ("hourmonth", -4.400603020246817),
+                                    ("dayday", -2.5288008433452256),
+                                    ("the <day-of-month> (ordinal)February", -3.9951379121386528),
+                                    ("WednesdayOctober", -4.400603020246817),
+                                    ("Wednesdaythis|last|next <cycle>", -3.9951379121386528),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.484312288372662),
+                                    ("dayyear", -2.791165107812717),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.400603020246817),
+                                    ("Thursdayhh:mm", -3.9951379121386528),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.400603020246817),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -3.9951379121386528),
+                                    ("TuesdayOctober", -4.400603020246817),
+                                    ("the <day-of-month> (ordinal)March", -4.400603020246817),
+                                    ("Mondaythis|last|next <cycle>", -4.400603020246817),
+                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.400603020246817),
+                                    ("Fridayintersect", -4.400603020246817),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -3.7074558396868715),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.484312288372662),
+                                    ("Tuesdaythis|last|next <cycle>", -4.400603020246817),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.400603020246817),
+                                    ("dayminute", -3.0143086591269266),
+                                    ("minuteday", -3.484312288372662),
+                                    ("this|last|next <cycle>Sunday", -4.400603020246817),
+                                    ("intersectyear (latent)", -4.400603020246817),
+                                    ("Sundaythis|last|next <cycle>", -4.400603020246817),
+                                    ("weekday", -4.400603020246817),
+                                    ("dayweek", -3.3019907315787074),
+                                    ("Thursday<time-of-day> am|pm", -4.400603020246817),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -3.9951379121386528),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -3.9951379121386528)],
+                               n = 51},
+                   koData =
+                     ClassData{prior = -0.9932517730102834, unseen = -4.804021044733257,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.102643365036796),
+                                    ("week-endOctober", -3.4094961844768505),
+                                    ("daymonth", -1.9054187877005764),
+                                    ("TuesdaySeptember", -4.102643365036796),
+                                    ("Wednesdayintersect", -4.102643365036796),
+                                    ("hourmonth", -3.004031076368686),
+                                    ("Fridaythis|last|next <cycle>", -4.102643365036796),
+                                    ("SundayFebruary", -4.102643365036796),
+                                    ("WednesdayOctober", -4.102643365036796),
+                                    ("week-endintersect", -4.102643365036796),
+                                    ("dayyear", -4.102643365036796),
+                                    ("FridayJuly", -3.6971782569286313),
+                                    ("FridaySeptember", -4.102643365036796),
+                                    ("WednesdayFebruary", -4.102643365036796),
+                                    ("minutemonth", -3.186352633162641),
+                                    ("SundayMarch", -4.102643365036796),
+                                    ("MondayFebruary", -3.6971782569286313),
+                                    ("Fridayintersect", -4.102643365036796),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.6971782569286313),
+                                    ("dayminute", -3.4094961844768505),
+                                    ("SaturdaySeptember", -4.102643365036796),
+                                    ("intersectSeptember", -3.186352633162641),
+                                    ("MondayMarch", -4.102643365036796),
+                                    ("on <date>September", -3.6971782569286313),
+                                    ("Tuesdayintersect", -4.102643365036796),
+                                    ("Sundayintersect", -4.102643365036796)],
+                               n = 30}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.772588722239781),
+                                    ("Martin Luther King's Day", -2.772588722239781),
+                                    ("Mother's Day", -2.772588722239781),
+                                    ("day", -1.1631508098056809), ("Sunday", -2.772588722239781),
+                                    ("Chinese New Year", -2.367123614131617),
+                                    ("Thanksgiving Day", -2.772588722239781),
+                                    ("Easter Sunday", -2.772588722239781),
+                                    ("hour", -2.772588722239781), ("Tuesday", -2.772588722239781),
+                                    ("week-end", -2.772588722239781)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.8873031950009028, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.5649493574615367), ("day", -2.159484249353372),
+                                    ("Sunday", -2.5649493574615367), ("hour", -1.466337068793427),
+                                    ("week-end", -1.466337068793427)],
+                               n = 7}}),
+       ("March",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.120263536200091),
+                                    ("Thursdayordinal (digits)", -2.5257286443082556),
+                                    ("day", -2.120263536200091),
+                                    ("Augustordinal (digits)", -2.5257286443082556),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.120263536200091),
+                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
+                                    ("month", -1.2729656758128873),
+                                    ("Marchordinal (digits)", -2.5257286443082556)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time-of-day>ordinal (digits)",
+                                     -1.8718021769015913),
+                                    ("Augustordinal (digits)", -1.8718021769015913),
+                                    ("month", -1.466337068793427)],
+                               n = 2}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -2.3025850929940455),
+                                    ("<time-of-day> am|pm", -1.6094379124341003),
+                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
+                                    ("minute", -1.3862943611198906)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7227665977411035),
+                                    ("yesterday", -2.2335922215070942),
+                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
+                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
+                               n = 10}}),
+       ("mm.dd.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -2.803360380906535),
+                                    ("a <unit-of-duration>Christmas", -2.803360380906535),
+                                    ("dayday", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>today", -2.803360380906535),
+                                    ("daysecond", -2.803360380906535),
+                                    ("a <unit-of-duration>right now", -2.803360380906535),
+                                    ("minutenograin", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>Christmas", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -2.803360380906535),
+                                    ("secondnograin", -2.803360380906535),
+                                    ("yearday", -2.1102132003465894),
+                                    ("daynograin", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>now", -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.4423470353692043),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.4423470353692043),
+                                    ("dayday", -2.03688192726104),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.4423470353692043),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.4423470353692043)],
+                               n = 3}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.803360380906535),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.803360380906535),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
+                                    ("integer (numeric)this|last|next <cycle>",
+                                     -2.3978952727983707),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("integer (numeric)February", -2.3978952727983707),
+                                    ("month", -0.9315582040049435),
+                                    ("ordinal (digits)March", -2.803360380906535),
+                                    ("integer (numeric)July", -2.803360380906535)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.7047480922384253),
+                                    ("month", -1.7047480922384253)],
+                               n = 1}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Labour Day weekend",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6888794541139363,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.9704144655697013),
+                                    ("Halloween", -2.9704144655697013),
+                                    ("Wednesday", -2.9704144655697013),
+                                    ("Boss's Day", -2.9704144655697013),
+                                    ("Memorial Day", -2.9704144655697013),
+                                    ("Monday", -2.9704144655697013),
+                                    ("Discovery Day", -2.9704144655697013),
+                                    ("Mother's Day", -2.9704144655697013),
+                                    ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -2.9704144655697013),
+                                    ("March", -2.9704144655697013), ("month", -2.9704144655697013),
+                                    ("Tuesday", -2.277267285009756)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> sharp|exactly",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.1400661634962708),
+                                    ("time-of-day (latent)", -2.1400661634962708),
+                                    ("hhmm (latent)", -2.1400661634962708),
+                                    ("<time-of-day> am|pm", -2.1400661634962708),
+                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
+                                    ("minute", -1.4469189829363254)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -2.4423470353692043),
+                                    ("year (latent)", -1.0560526742493137),
+                                    ("year", -1.0560526742493137), ("March", -2.4423470353692043),
+                                    ("month", -2.03688192726104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.2992829841302609),
+                                    ("year (latent)", -1.7047480922384253),
+                                    ("year", -1.7047480922384253), ("month", -1.2992829841302609)],
+                               n = 3}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -7.696104113612832e-2),
+                                    ("integer (0..19)", -2.6026896854443837)],
+                               n = 25}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> before last|after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
+                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by the end of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hhmm (military) am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.1918471524802814),
+                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
+                                    ("minuteminute", -1.457246097092175),
+                                    ("hh:mmhh:mm", -2.093234863812172),
+                                    ("dayday", -3.1918471524802814),
+                                    ("hourhour", -2.093234863812172),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
+                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -3.1135153092103742),
+                                    ("daymonth", -2.70805020110221),
+                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
+                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
+                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
+                                    ("minuteminute", -1.8607523407150064),
+                                    ("hourhour", -2.70805020110221),
+                                    ("minutehour", -2.70805020110221),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -3.1135153092103742),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.1135153092103742)],
+                               n = 12}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Day",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("National Patriots' Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.529395204760564),
+                                    ("hh:mmhh:mm", -1.8971199848858813),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.4849066497880004),
+                                    ("hourhour", -1.6964492894237302),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -3.4011973816621555),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.4011973816621555),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
+                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
+                                    ("hourhour", -2.2129729343043585),
+                                    ("minutehour", -1.2144441041932315),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.4657359027997265),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -2.5494451709255714),
+                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.0602707946915624)],
+                               n = 24}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.42121346507630353,
+                               unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5455312716044354),
+                                    ("Marchinteger (numeric)", -2.833213344056216),
+                                    ("Aprilinteger (numeric)", -3.2386784521643803),
+                                    ("month", -0.8407831793660099),
+                                    ("Februaryinteger (numeric)", -1.9859154836690123),
+                                    ("Septemberinteger (numeric)", -2.833213344056216),
+                                    ("Octoberinteger (numeric)", -2.833213344056216),
+                                    ("Julyinteger (numeric)", -2.1400661634962708)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time-of-day>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.2512917986064953),
+                                    ("Wednesday", -2.2512917986064953),
+                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
+                                    ("Tuesday", -1.55814461804655)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.791759469228055),
+                                    ("daymonth", -1.2809338454620642),
+                                    ("day (grain)intersect", -1.791759469228055),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("week (grain)intersect", -2.1972245773362196),
+                                    ("week (grain)September", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("right now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("for <duration> from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -1.5040773967762742),
+                                    ("dayday", -1.0986122886681098),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.252762968495368)],
+                               n = 1}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.832909122935104),
+                                    ("hh:mmhh:mm", -0.832909122935104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
+                                    ("minuteminute", -1.410986973710262),
+                                    ("minutehour", -1.410986973710262),
+                                    ("hh:mmintersect", -1.410986973710262)],
+                               n = 18}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -3.509131981127006e-2,
+                               unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
+                   koData =
+                     ClassData{prior = -3.367295829986474, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.791759469228055),
+                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.1972245773362196),
+                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
+                                    ("month", -0.9444616088408514),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("August",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/EN_GB.hs b/Duckling/Ranking/Classifiers/EN_GB.hs
--- a/Duckling/Ranking/Classifiers/EN_GB.hs
+++ b/Duckling/Ranking/Classifiers/EN_GB.hs
@@ -21,2395 +21,3044 @@
 classifiers :: Classifiers
 classifiers
   = HashMap.fromList
-      [("<integer> to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.7889513094975535, unseen = -5.225746673713201,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 184},
-                   koData =
-                     ClassData{prior = -0.6057243655887863, unseen = -5.407171771460119,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 221}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6094379124341003),
-                                    ("dayday", -1.0986122886681098),
-                                    ("day (grain)yesterday", -1.6094379124341003)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.466337068793427),
-                                    ("year (grain)Christmas", -1.8718021769015913),
-                                    ("day (grain)intersect", -1.466337068793427),
-                                    ("yearday", -1.8718021769015913)],
-                               n = 3}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("integer after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8109302162163288),
-                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
-                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -2.1400661634962708),
-                                    ("ordinal (digits)February", -2.1400661634962708),
-                                    ("integer (numeric)April", -2.1400661634962708),
-                                    ("month", -1.4469189829363254)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.844007281325252e-2,
-                               unseen = -4.430816798843313,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("dayhour", -1.5284688499004333),
-                                    ("Mondayearly morning", -3.3202283191284883),
-                                    ("time-of-day (latent)tonight", -3.3202283191284883),
-                                    ("hourhour", -2.339399066116762),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("todaypart of days", -3.7256934272366524),
-                                    ("minutehour", -2.627081138568543),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.3202283191284883),
-                                    ("time-of-day (latent)this <part-of-day>", -3.7256934272366524),
-                                    ("Mondayin|during the <part-of-day>", -3.7256934272366524),
-                                    ("intersectpart of days", -3.7256934272366524),
-                                    ("intersectin|during the <part-of-day>", -3.7256934272366524),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("tomorrowpart of days", -2.339399066116762),
-                                    ("hh:mmin|during the <part-of-day>", -3.0325462466767075),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("yesterdaypart of days", -3.7256934272366524),
-                                    ("Mondaypart of days", -3.7256934272366524)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -2.367123614131617, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.740840023925201),
-                                    ("monthhour", -2.740840023925201),
-                                    ("hourhour", -2.740840023925201),
-                                    ("past year (latent)in|during the <part-of-day>",
-                                     -2.740840023925201),
-                                    ("Februaryin|during the <part-of-day>", -2.740840023925201),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.740840023925201)],
-                               n = 3}}),
-       ("dd/mm",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -0.2876820724517809, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.381875521765486e-2,
-                               unseen = -4.90527477843843,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.7992275112828016),
-                                    ("noon|midnight|EOD|end of day", -3.7992275112828016),
-                                    ("integer after|past <hour-of-day>", -3.7992275112828016),
-                                    ("half after|past <hour-of-day>", -4.204692619390966),
-                                    ("time-of-day (latent)", -1.7197859696029658),
-                                    ("hhmm (latent)", -3.5115454388310208),
-                                    ("<time-of-day> am|pm", -1.8067973465925955),
-                                    ("hh:mm", -3.288401887516811),
-                                    ("about|exactly <time-of-day>", -3.7992275112828016),
-                                    ("hour", -1.0911773101805915),
-                                    ("<time-of-day> sharp|exactly", -4.204692619390966),
-                                    ("minute", -2.0074680420547466)],
-                               n = 61},
-                   koData =
-                     ClassData{prior = -2.412933150162911, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.791759469228055), ("dd/mm", -3.295836866004329),
-                                    ("absorption of , after named day", -2.890371757896165),
-                                    ("intersect", -2.890371757896165),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Friday", -3.295836866004329), ("day", -0.8979415932059586),
-                                    ("the <day-of-month> (ordinal)", -2.890371757896165),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.6026896854443837),
-                                    ("hour", -3.295836866004329)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -1.8718021769015913,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.916290731874155),
-                                    ("hh:mmhh:mm", -0.916290731874155)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.916290731874155),
-                                    ("minutehour", -0.916290731874155)],
-                               n = 3}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from|since|after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("July", -3.3141860046725258),
-                                    ("time-of-day (latent)", -2.3978952727983707),
-                                    ("<time-of-day> am|pm", -2.3978952727983707),
-                                    ("hh:mm", -2.3978952727983707), ("hour", -1.8101086078962516),
-                                    ("month", -2.908720896564361), ("minute", -2.3978952727983707),
-                                    ("August", -3.3141860046725258)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -4.836281906951478,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.7297014486341915),
-                                    ("week", -4.135166556742356),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.135166556742356),
-                                    ("today", -4.135166556742356),
-                                    ("intersect", -2.7488721956224653),
-                                    ("second", -4.135166556742356), ("now", -3.4420193761824103),
-                                    ("tomorrow", -3.7297014486341915),
-                                    ("this|last|next <cycle>", -4.135166556742356),
-                                    ("day", -1.995100393246085),
-                                    ("time-of-day (latent)", -4.135166556742356),
-                                    ("<time-of-day> am|pm", -3.7297014486341915),
-                                    ("nograin", -3.4420193761824103),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.135166556742356),
-                                    ("Christmas", -3.4420193761824103),
-                                    ("hour", -2.8824035882469876),
-                                    ("<datetime> - <datetime> (interval)", -2.7488721956224653),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.430418464503931),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -3.7297014486341915),
-                                    ("minute", -1.6928195213731514),
-                                    ("right now", -4.135166556742356),
-                                    ("<month> dd-dd (interval)", -3.4420193761824103),
-                                    ("dd-dd <month> (interval)", -3.7297014486341915)],
-                               n = 49}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -4.652001563489282e-2,
-                               unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.2188758248682006),
-                                    ("<integer> more <unit-of-duration>", -3.912023005428146),
-                                    ("three-quarters of an hour", -2.995732273553991),
-                                    ("<integer> + '\"", -3.2188758248682006),
-                                    ("number.number hours", -3.912023005428146),
-                                    ("second", -3.506557897319982), ("day", -3.2188758248682006),
-                                    ("half an hour", -2.995732273553991),
-                                    ("<integer> <unit-of-duration>", -1.6094379124341003),
-                                    ("a <unit-of-duration>", -2.995732273553991),
-                                    ("quarter of an hour", -2.995732273553991),
-                                    ("hour", -2.5257286443082556),
-                                    ("about|exactly <duration>", -3.912023005428146),
-                                    ("<integer> and an half hour", -3.912023005428146),
-                                    ("minute", -1.2729656758128873)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -3.0910424533583156, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -1.8971199848858813),
-                                    ("<integer> <unit-of-duration>", -2.3025850929940455),
-                                    ("a <unit-of-duration>", -2.3025850929940455)],
-                               n = 2}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.8209805520698302,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.4957877464014501, unseen = -6.293419278846481,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("hourday", -3.8936738667599493),
-                                    ("dayhour", -2.765208614942159),
-                                    ("daymonth", -4.90527477843843),
-                                    ("monthday", -5.19295685089021),
-                                    ("monthyear", -3.9889840465642745),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.598421958998375),
-                                    ("Christmasyear", -5.598421958998375),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.598421958998375),
-                                    ("houryear", -5.598421958998375),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.90527477843843),
-                                    ("<time-of-day> am|pmintersect", -4.345658990503007),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -5.598421958998375),
-                                    ("Marchyear", -5.598421958998375),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
-                                     -5.19295685089021),
-                                    ("intersect<time-of-day> am|pm", -5.598421958998375),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.598421958998375),
-                                    ("monthhour", -5.19295685089021),
-                                    ("last <day-of-week> of <time>year", -5.598421958998375),
-                                    ("todayat <time-of-day>", -5.598421958998375),
-                                    ("Thursday<time> timezone", -3.8936738667599493),
-                                    ("dd/mm<time-of-day> am|pm", -5.598421958998375),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("dayday", -3.58351893845611),
-                                    ("Thanksgiving Dayyear", -4.499809670330265),
-                                    ("dd/mmat <time-of-day>", -5.598421958998375),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.598421958998375),
-                                    ("Tuesdayin <named-month>", -5.598421958998375),
-                                    ("tonightat <time-of-day>", -5.598421958998375),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -4.90527477843843),
-                                    ("today<time-of-day> am|pm", -5.598421958998375),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.19295685089021),
-                                    ("at <time-of-day><time> <part-of-day>", -5.598421958998375),
-                                    ("hourhour", -4.345658990503007),
-                                    ("<time-of-day> am|pmon <date>", -3.58351893845611),
-                                    ("Wednesdaythis|last|next <cycle>", -5.598421958998375),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.0943445622221),
-                                    ("dayyear", -3.1560749236291703),
-                                    ("last weekend of <named-month>year", -5.598421958998375),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursdayat <time-of-day>", -5.19295685089021),
-                                    ("<time-of-day> am|pmtomorrow", -4.90527477843843),
-                                    ("minutehour", -4.68213122712422),
-                                    ("Mother's Dayyear", -5.598421958998375),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.19295685089021),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -3.8936738667599493),
-                                    ("for <duration> from <time>December", -5.598421958998375),
-                                    ("tomorrow<time-of-day> sharp|exactly", -5.598421958998375),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.19295685089021),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.68213122712422),
-                                    ("Mondayin|during the <part-of-day>", -5.598421958998375),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.19295685089021),
-                                    ("intersectin|during the <part-of-day>", -5.598421958998375),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.345658990503007),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -4.68213122712422),
-                                    ("at <time-of-day>intersect", -5.19295685089021),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.598421958998375),
-                                    ("dayminute", -2.924273309571846),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.19295685089021),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.19295685089021),
-                                    ("<ordinal> <cycle> of <time>year", -5.598421958998375),
-                                    ("minuteday", -2.132686056198648),
-                                    ("absorption of , after named dayintersect",
-                                     -5.598421958998375),
-                                    ("Octoberyear", -4.345658990503007),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -5.598421958998375),
-                                    ("<day-of-month> (ordinal or number) <named-month>year",
-                                     -5.598421958998375),
-                                    ("year<time-of-day> am|pm", -5.598421958998375),
-                                    ("Septemberyear", -5.19295685089021),
-                                    ("at <time-of-day>on <date>", -4.499809670330265),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("Halloweenyear", -5.598421958998375),
-                                    ("dayweek", -5.598421958998375),
-                                    ("Thursday<time-of-day> am|pm", -5.598421958998375),
-                                    ("weekyear", -5.19295685089021),
-                                    ("hh:mmin|during the <part-of-day>", -4.90527477843843),
-                                    ("Father's Dayyear", -5.598421958998375),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.19295685089021),
-                                    ("February<time> <part-of-day>", -5.598421958998375),
-                                    ("Martin Luther King's Dayyear", -5.19295685089021),
-                                    ("tomorrowat <time-of-day>", -4.90527477843843),
-                                    ("between <time> and <time>on <date>", -4.90527477843843),
-                                    ("Thursdayfrom|since|after <time-of-day>", -4.90527477843843),
-                                    ("at <time-of-day>tomorrow", -5.19295685089021),
-                                    ("tomorrow<time-of-day> am|pm", -5.598421958998375),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -5.598421958998375),
-                                    ("Labor Dayyear", -5.598421958998375),
-                                    ("Februaryintersect", -5.598421958998375),
-                                    ("last <cycle> of <time>year", -4.90527477843843),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -5.598421958998375),
-                                    ("yearminute", -5.598421958998375),
-                                    ("Black Fridayyear", -5.19295685089021)],
-                               n = 201},
-                   koData =
-                     ClassData{prior = -0.9392802500988537, unseen = -5.983936280687191,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("in <named-month>year", -5.288267030694535),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.288267030694535),
-                                    ("hourday", -5.288267030694535),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.288267030694535),
-                                    ("dayhour", -2.890371757896165),
-                                    ("daymonth", -3.2088254890146994),
-                                    ("monthday", -4.882801922586371),
-                                    ("monthyear", -4.59511985013459),
-                                    ("intersecthh:mm", -5.288267030694535),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.288267030694535),
-                                    ("houryear", -5.288267030694535),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.288267030694535),
-                                    ("until <time-of-day><time-of-day> am|pm", -5.288267030694535),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.59511985013459),
-                                    ("<time-of-day> am|pmintersect", -4.035504062199167),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.37197629882038),
-                                    ("from|since|after <time-of-day>on <date>", -4.37197629882038),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("absorption of , after named dayJuly", -4.882801922586371),
-                                    ("monthhour", -5.288267030694535),
-                                    ("hourmonth", -4.59511985013459),
-                                    ("todayat <time-of-day>", -5.288267030694535),
-                                    ("from|since|after <time-of-day>July", -5.288267030694535),
-                                    ("dayday", -4.882801922586371),
-                                    ("dd/mmat <time-of-day>", -4.882801922586371),
-                                    ("<time-of-day> am|pmon <date>", -4.035504062199167),
-                                    ("Thursdaydd/mm", -5.288267030694535),
-                                    ("dayyear", -4.035504062199167),
-                                    ("Thursdayat <time-of-day>", -4.035504062199167),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.288267030694535),
-                                    ("monthminute", -5.288267030694535),
-                                    ("<time-of-day> am|pmtomorrow", -5.288267030694535),
-                                    ("Thursdayhh:mm", -4.37197629882038),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("Fridayyear", -4.882801922586371),
-                                    ("minutemonth", -3.4965075614664802),
-                                    ("Sundayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.882801922586371),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("Aprilyear", -5.288267030694535),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.288267030694535),
-                                    ("dd/mm<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.288267030694535),
-                                    ("yesterday<time-of-day> am|pm", -5.288267030694535),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -4.37197629882038),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.288267030694535),
-                                    ("until <time-of-day>on <date>", -4.59511985013459),
-                                    ("at <time-of-day>intersect", -4.882801922586371),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("dayminute", -2.7625383863862796),
-                                    ("intersectSeptember", -3.784189633918261),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("minuteday", -2.3704962986102562),
-                                    ("absorption of , after named dayintersect",
-                                     -5.288267030694535),
-                                    ("Februaryin|during the <part-of-day>", -5.288267030694535),
-                                    ("week-endin <named-month>", -5.288267030694535),
-                                    ("Octoberyear", -5.288267030694535),
-                                    ("from|since|after <time-of-day>year", -5.288267030694535),
-                                    ("yearhh:mm", -5.288267030694535),
-                                    ("hh:mmon <date>", -3.784189633918261),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -5.288267030694535),
-                                    ("absorption of , after named daySeptember", -4.37197629882038),
-                                    ("on <date>September", -4.882801922586371),
-                                    ("at <time-of-day>on <date>", -4.882801922586371),
-                                    ("dayweek", -5.288267030694535),
-                                    ("Thursday<time-of-day> am|pm", -4.882801922586371),
-                                    ("absorption of , after named dayFebruary", -4.37197629882038),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.288267030694535),
-                                    ("tomorrowat <time-of-day>", -5.288267030694535),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.288267030694535),
-                                    ("Thursdayfrom|since|after <time-of-day>", -3.6788291182604347),
-                                    ("tomorrow<time-of-day> am|pm", -5.288267030694535),
-                                    ("Tuesdayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("yearminute", -5.288267030694535)],
-                               n = 129}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.16251892949777494),
-                                    ("integer (0..19)", -1.8971199848858813)],
-                               n = 18}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.0149030205422647),
-                                    ("quarteryear", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.0149030205422647),
-                                    ("weekmonth", -1.6094379124341003),
-                                    ("ordinal (digits)quarter (grain)year", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)past year (latent)",
-                                     -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd/mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>integer (numeric)",
-                                     -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 1}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.9808292530117262),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -2.0794415416798357),
-                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
-                                     -1.6739764335716716),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
-                                     -1.6739764335716716)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.0986122886681098),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
-                                     -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
-                                     -1.3862943611198906)],
-                               n = 3}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.6094379124341003),
-                                    ("hourday", -0.916290731874155),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -1.6094379124341003),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("past year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15822400521489416,
-                               unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5488132906176655),
-                                    ("month (grain)", -2.995732273553991),
-                                    ("year (grain)", -1.817077277212345),
-                                    ("week (grain)", -1.5488132906176655),
-                                    ("quarter", -2.772588722239781), ("year", -1.817077277212345),
-                                    ("month", -2.995732273553991),
-                                    ("quarter (grain)", -2.772588722239781)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -1.9218125974762528,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.4816045409242156),
-                                    ("week (grain)", -1.4816045409242156),
-                                    ("day", -1.9924301646902063),
-                                    ("day (grain)", -1.9924301646902063)],
-                               n = 6}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -2.1972245773362196),
-                                    ("end of month", -2.1972245773362196),
-                                    ("time-of-day (latent)", -2.1972245773362196),
-                                    ("<time-of-day> am|pm", -2.1972245773362196),
-                                    ("hh:mm", -2.1972245773362196), ("hour", -1.791759469228055),
-                                    ("month", -2.1972245773362196), ("minute", -1.791759469228055)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2006706954621511,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.7047480922384253,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("ordinal (digits)", -0.2876820724517809)],
-                               n = 2}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.5315058290035293,
-                               unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.12136085700426748),
-                                    ("integer (0..19)", -2.3025850929940455)],
-                               n = 67},
-                   koData =
-                     ClassData{prior = -0.8860508466844369,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.10536051565782628),
-                                    ("integer (0..19)", -2.8134107167600364),
-                                    ("integer 21..99", -3.2188758248682006)],
-                               n = 47}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.2578291093020998, unseen = -3.58351893845611,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -1.4816045409242156,
-                               unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 10}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.1479201300766222,
-                               unseen = -5.0875963352323845,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4423470353692043),
-                                    ("integer (0..19)year (grain)", -3.289644895756408),
-                                    ("integer (numeric)day (grain)", -2.6835090921860925),
-                                    ("integer (0..19)second (grain) ", -3.6951100038645723),
-                                    ("integer (0..19)hour (grain)", -3.001962823304627),
-                                    ("second", -3.289644895756408),
-                                    ("integer (numeric)second (grain) ", -3.982792076316353),
-                                    ("integer (numeric)year (grain)", -3.6951100038645723),
-                                    ("day", -2.4423470353692043), ("year", -2.8841797876482436),
-                                    ("integer (numeric)week (grain)", -3.001962823304627),
-                                    ("integer (0..19)month (grain)", -3.4719664525503626),
-                                    ("hour", -2.5964977151964628), ("month", -3.1354942159291497),
-                                    ("integer (numeric)minute (grain)", -3.1354942159291497),
-                                    ("integer (0..19)minute (grain)", -3.001962823304627),
-                                    ("integer (numeric)month (grain)", -3.982792076316353),
-                                    ("minute", -2.4423470353692043),
-                                    ("integer (numeric)hour (grain)", -3.4719664525503626),
-                                    ("integer (0..19)day (grain)", -3.6951100038645723),
-                                    ("integer (0..19)week (grain)", -3.1354942159291497)],
-                               n = 69},
-                   koData =
-                     ClassData{prior = -1.984131361875511, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2929871246814741,
-                               unseen = -5.3230099791384085,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer after|past <hour-of-day>", -3.9318256327243257),
-                                    ("at <time-of-day>", -2.2270775404859005),
-                                    ("from|since|after <time-of-day>", -3.708682081410116),
-                                    ("<time-of-day> o'clock", -4.219507705176107),
-                                    ("half after|past <hour-of-day>", -4.219507705176107),
-                                    ("time-of-day (latent)", -1.7346010553881064),
-                                    ("hhmm (latent)", -4.624972813284271),
-                                    ("hh:mm", -2.2735975561207935),
-                                    ("quarter after|past <hour-of-day>", -4.624972813284271),
-                                    ("about|exactly <time-of-day>", -4.624972813284271),
-                                    ("until <time-of-day>", -3.9318256327243257),
-                                    ("hour", -1.2237754316221157),
-                                    ("<time-of-day> sharp|exactly", -4.624972813284271),
-                                    ("minute", -1.7346010553881064)],
-                               n = 94},
-                   koData =
-                     ClassData{prior = -1.3705460041517514, unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
-                                    ("from|since|after <time-of-day>", -3.283414346005772),
-                                    ("<hour-of-day> <integer>", -3.6888794541139363),
-                                    ("time-of-day (latent)", -1.0498221244986778),
-                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
-                               n = 32}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5753641449035618,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("year (grain)", -2.772588722239781),
-                                    ("second", -2.772588722239781),
-                                    ("week (grain)", -2.0794415416798357),
-                                    ("day", -2.0794415416798357),
-                                    ("minute (grain)", -2.772588722239781),
-                                    ("year", -2.772588722239781),
-                                    ("second (grain) ", -2.772588722239781),
-                                    ("minute", -2.772588722239781),
-                                    ("day (grain)", -2.0794415416798357)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.8266785731844679, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -5.129329438755058e-2,
-                               unseen = -4.07753744390572,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 57},
-                   koData =
-                     ClassData{prior = -2.995732273553991, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.639057329615259),
-                                    ("this|last|next <cycle>", -2.639057329615259),
-                                    ("day", -2.2335922215070942),
-                                    ("time-of-day (latent)", -2.639057329615259),
-                                    ("hhmm (latent)", -2.2335922215070942),
-                                    ("<time-of-day> am|pm", -2.639057329615259),
-                                    ("hour", -1.9459101490553135),
-                                    ("next <time>", -2.639057329615259),
-                                    ("this|next <day-of-week>", -2.639057329615259),
-                                    ("minute", -2.2335922215070942)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dd/mm", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.48130318449966897,
-                               unseen = -5.170483995038151,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayhour", -3.2188758248682006),
-                                    ("daymonth", -3.2188758248682006),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.471638793363569),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.7784916128036232),
-                                    ("Wednesdayintersect", -4.471638793363569),
-                                    ("Labor Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Black Fridaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.471638793363569),
-                                    ("<part-of-day> of <time>February", -4.471638793363569),
-                                    ("Saturday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -4.471638793363569),
-                                    ("on <date><time-of-day> am|pm", -4.471638793363569),
-                                    ("hourmonth", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.471638793363569),
-                                    ("dayday", -2.5998366164619773),
-                                    ("the <day-of-month> (ordinal)February", -4.0661736852554045),
-                                    ("WednesdayOctober", -4.471638793363569),
-                                    ("Wednesdaythis|last|next <cycle>", -4.0661736852554045),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.5553480614894135),
-                                    ("dayyear", -2.8622008809294686),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.471638793363569),
-                                    ("Thursdayhh:mm", -4.0661736852554045),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Memorial Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("TuesdayOctober", -4.471638793363569),
-                                    ("the <day-of-month> (ordinal)March", -4.471638793363569),
-                                    ("Mondaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.0661736852554045),
-                                    ("Fridayintersect", -4.471638793363569),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.7784916128036232),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.5553480614894135),
-                                    ("Tuesdaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayminute", -2.6798793241355137),
-                                    ("intersectyear", -4.471638793363569),
-                                    ("minuteday", -3.5553480614894135),
-                                    ("this|last|next <cycle>Sunday", -4.471638793363569),
-                                    ("Sundaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersectintersect", -4.471638793363569),
-                                    ("weekday", -4.471638793363569),
-                                    ("dayweek", -3.373026504695459),
-                                    ("Thursday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -4.0661736852554045)],
-                               n = 55},
-                   koData =
-                     ClassData{prior = -0.9622758451159785, unseen = -4.897839799950911,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.197201947661808),
-                                    ("week-endOctober", -3.5040547671018634),
-                                    ("daymonth", -1.9999773703255892),
-                                    ("TuesdaySeptember", -4.197201947661808),
-                                    ("Wednesdayintersect", -4.197201947661808),
-                                    ("hourmonth", -3.0985896589936988),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.197201947661808),
-                                    ("Fridaythis|last|next <cycle>", -4.197201947661808),
-                                    ("SundayFebruary", -4.197201947661808),
-                                    ("WednesdayOctober", -4.197201947661808),
-                                    ("week-endintersect", -4.197201947661808),
-                                    ("dayyear", -4.197201947661808),
-                                    ("FridayJuly", -3.791736839553644),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.197201947661808),
-                                    ("FridaySeptember", -4.197201947661808),
-                                    ("WednesdayFebruary", -4.197201947661808),
-                                    ("minutemonth", -3.2809112157876537),
-                                    ("SundayMarch", -4.197201947661808),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.197201947661808),
-                                    ("MondayFebruary", -3.791736839553644),
-                                    ("Fridayintersect", -4.197201947661808),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.791736839553644),
-                                    ("dayminute", -2.810907586541918),
-                                    ("SaturdaySeptember", -4.197201947661808),
-                                    ("intersectSeptember", -3.2809112157876537),
-                                    ("MondayMarch", -4.197201947661808),
-                                    ("on <date>September", -3.791736839553644),
-                                    ("intersectintersect", -4.197201947661808),
-                                    ("Tuesdayintersect", -4.197201947661808),
-                                    ("Sundayintersect", -4.197201947661808)],
-                               n = 34}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6286086594223742, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.6026896854443837),
-                                    ("Martin Luther King's Day", -2.6026896854443837),
-                                    ("Memorial Day", -2.6026896854443837),
-                                    ("Mother's Day", -2.6026896854443837),
-                                    ("day", -1.2163953243244932), ("Sunday", -2.6026896854443837),
-                                    ("Thanksgiving Day", -2.6026896854443837),
-                                    ("hour", -2.6026896854443837), ("Tuesday", -2.6026896854443837),
-                                    ("week-end", -2.6026896854443837)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.7621400520468967, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.5257286443082556), ("day", -2.120263536200091),
-                                    ("Sunday", -2.5257286443082556), ("hour", -1.4271163556401458),
-                                    ("week-end", -1.4271163556401458)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time-of-day>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Labor Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -2.3025850929940455),
-                                    ("<time-of-day> am|pm", -1.6094379124341003),
-                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
-                                    ("minute", -1.3862943611198906)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.7227665977411035),
-                                    ("yesterday", -2.2335922215070942),
-                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
-                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
-                               n = 10}}),
-       ("dd.mm.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.70805020110221),
-                                    ("a <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>today", -2.70805020110221),
-                                    ("daysecond", -2.70805020110221),
-                                    ("a <unit-of-duration>right now", -2.70805020110221),
-                                    ("minutenograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("secondnograin", -2.70805020110221),
-                                    ("yearday", -2.0149030205422647),
-                                    ("daynograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>now", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.3978952727983707),
-                                    ("dayday", -1.9924301646902063),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.3978952727983707)],
-                               n = 3}}),
-       ("Independence Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.803360380906535),
-                                    ("Halloween", -2.803360380906535),
-                                    ("Wednesday", -2.803360380906535),
-                                    ("Memorial Day", -2.803360380906535),
-                                    ("Monday", -2.803360380906535),
-                                    ("Mother's Day", -2.803360380906535),
-                                    ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.803360380906535),
-                                    ("March", -2.803360380906535), ("month", -2.803360380906535),
-                                    ("Tuesday", -2.1102132003465894)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> before last|after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -1.8718021769015913),
-                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
-                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by the end of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("this|last|next <cycle>", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hhmm (military) am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.1918471524802814),
-                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
-                                    ("minuteminute", -1.457246097092175),
-                                    ("hh:mmhh:mm", -2.093234863812172),
-                                    ("dayday", -3.1918471524802814),
-                                    ("hourhour", -2.093234863812172),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
-                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.1135153092103742),
-                                    ("daymonth", -2.70805020110221),
-                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
-                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
-                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
-                                    ("minuteminute", -1.8607523407150064),
-                                    ("hourhour", -2.70805020110221),
-                                    ("minutehour", -2.70805020110221),
-                                    ("hh:mmintersect", -2.1972245773362196),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.1135153092103742),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.1135153092103742)],
-                               n = 12}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.252762968495368), ("March", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.8472978603872037),
-                                    ("month", -0.8472978603872037)],
-                               n = 2}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.529395204760564),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -2.4849066497880004),
-                                    ("hourhour", -1.6964492894237302),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
-                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
-                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
-                                    ("hourhour", -2.2129729343043585),
-                                    ("minutehour", -1.2144441041932315),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.4657359027997265),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -2.5494451709255714),
-                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.0602707946915624)],
-                               n = 24}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time-of-day>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 33},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.791759469228055),
-                                    ("daymonth", -1.2809338454620642),
-                                    ("day (grain)intersect", -1.791759469228055),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("week (grain)intersect", -2.1972245773362196),
-                                    ("week (grain)September", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Labor Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0116009116784799),
-                                    ("hh:mmhh:mm", -1.0116009116784799)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.4469189829363254),
-                                    ("minuteminute", -1.4469189829363254),
-                                    ("minutehour", -1.4469189829363254),
-                                    ("hh:mmintersect", -1.4469189829363254)],
-                               n = 6}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -4.0821994520255166e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -3.2188758248682006,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.5257286443082556),
-                                    ("Martin Luther King's Day", -2.5257286443082556),
-                                    ("Monday", -2.5257286443082556), ("day", -1.1394342831883648),
-                                    ("Thanksgiving Day", -2.5257286443082556),
-                                    ("hour", -2.5257286443082556), ("winter", -2.5257286443082556),
-                                    ("week-end", -2.5257286443082556),
-                                    ("summer", -2.120263536200091)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("August",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}})]
+      [("Bhai Dooj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7537718023763802),
+                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
+                               n = 7}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.824549292051046),
+                                    ("<time-of-day> am|pm", -1.6422277352570913),
+                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
+                                    ("minute", -1.824549292051046)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6366143532277309, unseen = -5.648974238161206,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 282},
+                   koData =
+                     ClassData{prior = -0.7530684850340607, unseen = -5.53338948872752,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 251}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
+                                    ("year", -2.662587827025453),
+                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
+                                    ("a <unit-of-duration>", -2.662587827025453),
+                                    ("month", -2.662587827025453),
+                                    ("fortnight", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.5040773967762742),
+                                    ("<integer> <unit-of-duration>", -1.5040773967762742)],
+                               n = 1}}),
+       ("noon|midnight|EOD|end of day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Father's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8109302162163288),
+                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
+                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)December", -2.1400661634962708),
+                                    ("ordinal (digits)February", -2.1400661634962708),
+                                    ("integer (numeric)April", -2.1400661634962708),
+                                    ("month", -1.4469189829363254)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.6741486494265287),
+                                    ("ordinal (digits)July", -2.6741486494265287),
+                                    ("integer (numeric)September", -2.268683541318364),
+                                    ("ordinal (digits)August", -2.6741486494265287),
+                                    ("integer (numeric)August", -2.6741486494265287),
+                                    ("ordinal (digits)April", -2.6741486494265287),
+                                    ("month", -1.0647107369924282),
+                                    ("integer (numeric)July", -2.268683541318364)],
+                               n = 9}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.48863636973214,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("dayhour", -1.4816045409242156),
+                                    ("Mondayearly morning", -3.378724525810097),
+                                    ("time-of-day (latent)tonight", -3.378724525810097),
+                                    ("hourhour", -2.3978952727983707),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("todaypart of days", -3.784189633918261),
+                                    ("minutehour", -2.6855773452501515),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.378724525810097),
+                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
+                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
+                                    ("intersectpart of days", -3.784189633918261),
+                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("tomorrowpart of days", -2.3978952727983707),
+                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("yesterdaypart of days", -3.378724525810097),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("Mondaypart of days", -3.784189633918261)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.772588722239781),
+                                    ("monthhour", -2.772588722239781),
+                                    ("hourhour", -2.772588722239781),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -2.772588722239781),
+                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.772588722239781)],
+                               n = 3}}),
+       ("dd/mm",
+        Classifier{okData =
+                     ClassData{prior = -1.2685113254635072,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -0.33024168687057687,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23}}),
+       ("today",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.961215868968717e-2,
+                               unseen = -4.948759890378168,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.8430301339411947),
+                                    ("noon|midnight|EOD|end of day", -3.8430301339411947),
+                                    ("integer after|past <hour-of-day>", -3.8430301339411947),
+                                    ("half after|past <hour-of-day>", -4.248495242049359),
+                                    ("time-of-day (latent)", -1.6835458845878222),
+                                    ("hhmm (latent)", -3.5553480614894135),
+                                    ("<time-of-day> am|pm", -1.8061482066801546),
+                                    ("hh:mm", -3.332204510175204),
+                                    ("about|exactly <time-of-day>", -3.8430301339411947),
+                                    ("hour", -1.0704414117014134),
+                                    ("<time-of-day> sharp|exactly", -4.248495242049359),
+                                    ("minute", -2.05127066471314)],
+                               n = 64},
+                   koData =
+                     ClassData{prior = -2.456735772821304, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.2321436812926323),
+                                    ("hour", -1.2321436812926323)],
+                               n = 6}}),
+       ("December",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -2.1972245773362196),
+                                    ("Wednesday", -2.6026896854443837),
+                                    ("Saturday", -2.6026896854443837),
+                                    ("Monday", -2.1972245773362196),
+                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
+                                    ("Sunday", -2.6026896854443837)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("tonight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the ides of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.4816045409242156),
+                                    ("dd/mm", -3.4965075614664802),
+                                    ("absorption of , after named day", -3.0910424533583156),
+                                    ("intersect", -3.0910424533583156),
+                                    ("Saturday", -2.803360380906535),
+                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
+                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.803360380906535),
+                                    ("hour", -3.4965075614664802)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.791759469228055)],
+                               n = 4}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.11122563511022437,
+                               unseen = -3.970291913552122,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 51},
+                   koData =
+                     ClassData{prior = -2.2512917986064953,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.7884573603642702),
+                                    ("hh:mmhh:mm", -0.7884573603642702)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
+                                    ("minutehour", -0.7884573603642702)],
+                               n = 9}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("October",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from|since|after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.5950491749820006, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July", -3.332204510175204),
+                                    ("time-of-day (latent)", -2.4159137783010487),
+                                    ("<time-of-day> am|pm", -2.4159137783010487),
+                                    ("hh:mm", -2.4159137783010487), ("hour", -1.8281271133989299),
+                                    ("month", -2.9267394020670396), ("minute", -2.4159137783010487),
+                                    ("August", -3.332204510175204)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.22677331936478848,
+                               unseen = -4.9344739331306915,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.828641396489095),
+                                    ("week", -4.23410650459726),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.23410650459726),
+                                    ("today", -4.23410650459726), ("intersect", -2.362304327695668),
+                                    ("second", -4.23410650459726), ("now", -3.5409593240373143),
+                                    ("tomorrow", -3.828641396489095),
+                                    ("this|last|next <cycle>", -4.23410650459726),
+                                    ("day", -1.8827312474337816),
+                                    ("time-of-day (latent)", -4.23410650459726),
+                                    ("<time-of-day> am|pm", -3.828641396489095),
+                                    ("nograin", -3.5409593240373143),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.23410650459726),
+                                    ("Easter Sunday", -4.23410650459726),
+                                    ("Christmas", -3.5409593240373143),
+                                    ("hour", -2.981343536101891), ("month", -4.23410650459726),
+                                    ("<datetime> - <datetime> (interval)", -2.847812143477369),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.5293584123588344),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -3.828641396489095),
+                                    ("minute", -1.749199854809259),
+                                    ("right now", -4.23410650459726),
+                                    ("<month> dd-dd (interval)", -3.5409593240373143),
+                                    ("dd-dd <month> (interval)", -3.828641396489095)],
+                               n = 55}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> more <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.11000089521432846,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.248434627109745),
+                                    ("<integer> more <unit-of-duration>", -3.9415818076696905),
+                                    ("three-quarters of an hour", -3.0252910757955354),
+                                    ("<integer> + '\"", -3.248434627109745),
+                                    ("number.number hours", -3.9415818076696905),
+                                    ("second", -3.536116699561526), ("day", -3.248434627109745),
+                                    ("half an hour", -3.0252910757955354),
+                                    ("year", -3.9415818076696905),
+                                    ("<integer> <unit-of-duration>", -1.5902065505062128),
+                                    ("a <unit-of-duration>", -3.0252910757955354),
+                                    ("quarter of an hour", -3.0252910757955354),
+                                    ("hour", -2.5552874465498),
+                                    ("about|exactly <duration>", -3.9415818076696905),
+                                    ("<integer> and an half hour", -3.9415818076696905),
+                                    ("minute", -1.3025244780544318)],
+                               n = 43},
+                   koData =
+                     ClassData{prior = -2.2617630984737906, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -2.1972245773362196), ("year", -1.9095425048844386),
+                                    ("<integer> <unit-of-duration>", -1.9095425048844386),
+                                    ("a <unit-of-duration>", -2.1972245773362196)],
+                               n = 5}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half <integer> (UK style hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8209805520698302,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -0.6931471805599453),
+                                    ("Diwali<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.45868580431307404,
+                               unseen = -6.723832440821209,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.029482614295503),
+                                    ("Father's Dayyear (latent)", -6.029482614295503),
+                                    ("Ramadanyear (latent)", -6.029482614295503),
+                                    ("<datetime> - <datetime> (interval)on <date>",
+                                     -4.776719645800135),
+                                    ("Bhai Doojyear (latent)", -6.029482614295503),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.776719645800135),
+                                    ("hourday", -4.324734522057078),
+                                    ("dayhour", -3.1117118822112237),
+                                    ("Martin Luther King's Dayyear (latent)", -5.6240175061873385),
+                                    ("Shemini Atzeretyear (latent)", -6.029482614295503),
+                                    ("daymonth", -5.336335433735558),
+                                    ("monthday", -5.6240175061873385),
+                                    ("monthyear", -4.420044701861403),
+                                    ("Yom Ha'atzmautyear (latent)", -6.029482614295503),
+                                    ("Vijayadashamiyear (latent)", -6.029482614295503),
+                                    ("Thanksgiving Dayyear (latent)", -4.930870325627393),
+                                    ("Thai Pongalyear (latent)", -5.336335433735558),
+                                    ("Thiru Onamyear (latent)", -5.336335433735558),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.029482614295503),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -6.029482614295503),
+                                    ("houryear", -5.336335433735558),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.029482614295503),
+                                    ("Christmas<time-of-day> am|pm", -6.029482614295503),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.029482614295503),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.336335433735558),
+                                    ("<time-of-day> am|pmintersect", -4.776719645800135),
+                                    ("Octoberyear (latent)", -4.776719645800135),
+                                    ("intersect<time-of-day> am|pm", -6.029482614295503),
+                                    ("Mattu Pongalyear (latent)", -6.029482614295503),
+                                    ("Shavuotyear (latent)", -6.029482614295503),
+                                    ("Dhanterasin <named-month>|year", -6.029482614295503),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.029482614295503),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.029482614295503),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.6240175061873385),
+                                    ("Marchyear (latent)", -6.029482614295503),
+                                    ("Sukkotyear (latent)", -5.6240175061873385),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.029482614295503),
+                                    ("Clean Mondayyear (latent)", -5.6240175061873385),
+                                    ("monthhour", -5.6240175061873385),
+                                    ("todayat <time-of-day>", -6.029482614295503),
+                                    ("Thursday<time> timezone", -4.324734522057078),
+                                    ("dd/mm<time-of-day> am|pm", -6.029482614295503),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.029482614295503),
+                                    ("Palm SundaySunday", -5.6240175061873385),
+                                    ("dayday", -3.8322580369592836),
+                                    ("dd/mmat <time-of-day>", -6.029482614295503),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.029482614295503),
+                                    ("tonightat <time-of-day>", -6.029482614295503),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.336335433735558),
+                                    ("today<time-of-day> am|pm", -6.029482614295503),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.6240175061873385),
+                                    ("at <time-of-day><time> <part-of-day>", -6.029482614295503),
+                                    ("hourhour", -4.776719645800135),
+                                    ("<time-of-day> am|pmon <date>", -4.014579593753238),
+                                    ("Wednesdaythis|last|next <cycle>", -6.029482614295503),
+                                    ("Lentyear (latent)", -6.029482614295503),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.5254052175192285),
+                                    ("Boghiyear (latent)", -6.029482614295503),
+                                    ("dayyear", -1.9776976664921981),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.029482614295503),
+                                    ("Thursdayat <time-of-day>", -5.6240175061873385),
+                                    ("Islamic New Yearyear (latent)", -5.6240175061873385),
+                                    ("Laylat al-Qadryear (latent)", -5.113191882421348),
+                                    ("Chhathin <named-month>|year", -6.029482614295503),
+                                    ("Vasant Panchamiin <named-month>|year", -6.029482614295503),
+                                    ("Diwaliin <named-month>|year", -6.029482614295503),
+                                    ("Shrove Tuesdayyear (latent)", -6.029482614295503),
+                                    ("<time-of-day> am|pmtomorrow", -5.336335433735558),
+                                    ("Yom Kippuryear (latent)", -6.029482614295503),
+                                    ("<part-of-day> of <time>year (latent)", -6.029482614295503),
+                                    ("minutehour", -5.113191882421348),
+                                    ("Kaanum Pongalyear (latent)", -5.6240175061873385),
+                                    ("Maha Saptamiyear (latent)", -6.029482614295503),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.6240175061873385),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.324734522057078),
+                                    ("for <duration> from <time>December", -6.029482614295503),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.029482614295503),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.113191882421348),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.6240175061873385),
+                                    ("Pentecostyear (latent)", -6.029482614295503),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.113191882421348),
+                                    ("Eid al-Fitryear (latent)", -6.029482614295503),
+                                    ("Mondayin|during the <part-of-day>", -6.029482614295503),
+                                    ("Raksha Bandhanyear (latent)", -6.029482614295503),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.6240175061873385),
+                                    ("Navaratriin <named-month>|year", -6.029482614295503),
+                                    ("Ashurayear (latent)", -6.029482614295503),
+                                    ("Chinese New Yearyear (latent)", -6.029482614295503),
+                                    ("Sundayyear (latent)", -6.029482614295503),
+                                    ("Lag BaOmeryear (latent)", -6.029482614295503),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.029482614295503),
+                                    ("Eid al-Adhayear (latent)", -5.113191882421348),
+                                    ("intersectin|during the <part-of-day>", -6.029482614295503),
+                                    ("Christmasat <time-of-day>", -6.029482614295503),
+                                    ("Passoveryear (latent)", -6.029482614295503),
+                                    ("Lazarus Saturdayyear (latent)", -6.029482614295503),
+                                    ("dd/mmyear (latent)", -6.029482614295503),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.029482614295503),
+                                    ("Yom HaShoahyear (latent)", -5.6240175061873385),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -5.113191882421348),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.029482614295503),
+                                    ("Thai Pongalin <named-month>|year", -6.029482614295503),
+                                    ("Septemberyear (latent)", -5.6240175061873385),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -4.776719645800135),
+                                    ("Halloweenyear (latent)", -6.029482614295503),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.336335433735558),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -5.113191882421348),
+                                    ("at <time-of-day>intersect", -5.6240175061873385),
+                                    ("Rosh Hashanahyear (latent)", -6.029482614295503),
+                                    ("Dhanterasyear (latent)", -6.029482614295503),
+                                    ("Tu BiShvatyear (latent)", -6.029482614295503),
+                                    ("Holiyear (latent)", -5.336335433735558),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.029482614295503),
+                                    ("Holika Dahanyear (latent)", -5.336335433735558),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.029482614295503),
+                                    ("dayminute", -3.3904252846802443),
+                                    ("Mawlidyear (latent)", -6.029482614295503),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.6240175061873385),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.029482614295503),
+                                    ("Jumu'atul-Widayear (latent)", -5.113191882421348),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.029482614295503),
+                                    ("minuteday", -2.391896454569117),
+                                    ("absorption of , after named dayintersect",
+                                     -6.029482614295503),
+                                    ("intersectyear (latent)", -6.029482614295503),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.029482614295503),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.029482614295503),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.029482614295503),
+                                    ("Mothering Sundayyear (latent)", -5.6240175061873385),
+                                    ("Boss's Dayyear (latent)", -5.6240175061873385),
+                                    ("Tisha B'Avyear (latent)", -6.029482614295503),
+                                    ("Isra and Mi'rajyear (latent)", -5.113191882421348),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.029482614295503),
+                                    ("Christmasyear (latent)", -5.6240175061873385),
+                                    ("Naraka Chaturdashiyear (latent)", -5.6240175061873385),
+                                    ("at <time-of-day>on <date>", -4.930870325627393),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.420044701861403),
+                                    ("dayweek", -6.029482614295503),
+                                    ("Easter Sundayyear (latent)", -5.336335433735558),
+                                    ("Thursday<time-of-day> am|pm", -6.029482614295503),
+                                    ("weekyear", -5.6240175061873385),
+                                    ("hh:mmin|during the <part-of-day>", -5.336335433735558),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.6240175061873385),
+                                    ("Hanukkahyear (latent)", -6.029482614295503),
+                                    ("February<time> <part-of-day>", -6.029482614295503),
+                                    ("Tuesdayin <named-month>|year", -6.029482614295503),
+                                    ("Great Lentyear (latent)", -6.029482614295503),
+                                    ("tomorrowat <time-of-day>", -5.336335433735558),
+                                    ("between <time> and <time>on <date>", -4.420044701861403),
+                                    ("Thursdayfrom|since|after <time-of-day>", -5.336335433735558),
+                                    ("last <cycle> of <time>year (latent)", -5.336335433735558),
+                                    ("at <time-of-day>tomorrow", -5.6240175061873385),
+                                    ("tomorrow<time-of-day> am|pm", -6.029482614295503),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.029482614295503),
+                                    ("Diwaliyear (latent)", -6.029482614295503),
+                                    ("Black Fridayyear (latent)", -5.6240175061873385),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.029482614295503),
+                                    ("Chhathyear (latent)", -5.6240175061873385),
+                                    ("Vasant Panchamiyear (latent)", -6.029482614295503),
+                                    ("Palm Sundayintersect", -6.029482614295503),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.029482614295503),
+                                    ("August Bank Holidayyear (latent)", -5.336335433735558),
+                                    ("Februaryintersect", -6.029482614295503),
+                                    ("Simchat Torahyear (latent)", -6.029482614295503)],
+                               n = 311},
+                   koData =
+                     ClassData{prior = -0.9999816852264825, unseen = -6.349138991379798,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.654242029096065),
+                                    ("hourday", -5.654242029096065),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.654242029096065),
+                                    ("dayhour", -3.2118949937268604),
+                                    ("daymonth", -3.574800487416229),
+                                    ("monthday", -5.2487769209879005),
+                                    ("monthyear", -4.401479060600697),
+                                    ("<time-of-day> am|pmyear (latent)", -5.2487769209879005),
+                                    ("Thai Pongalyear (latent)", -4.96109484853612),
+                                    ("intersecthh:mm", -5.654242029096065),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.654242029096065),
+                                    ("houryear", -4.73795129722191),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.654242029096065),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.654242029096065),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.96109484853612),
+                                    ("<time-of-day> am|pmintersect", -4.401479060600697),
+                                    ("Octoberyear (latent)", -5.654242029096065),
+                                    ("from|since|after <time-of-day>year (latent)",
+                                     -4.401479060600697),
+                                    ("from|since|after <time-of-day>on <date>", -4.73795129722191),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.654242029096065),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.401479060600697),
+                                    ("about|exactly <time-of-day>year (latent)",
+                                     -5.654242029096065),
+                                    ("absorption of , after named dayJuly", -5.2487769209879005),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.73795129722191),
+                                    ("Clean Mondayyear (latent)", -5.654242029096065),
+                                    ("monthhour", -5.654242029096065),
+                                    ("hourmonth", -4.96109484853612),
+                                    ("todayat <time-of-day>", -5.654242029096065),
+                                    ("Bank Holidayyear (latent)", -4.96109484853612),
+                                    ("from|since|after <time-of-day>July", -5.654242029096065),
+                                    ("Mondayyear (latent)", -4.96109484853612),
+                                    ("dayday", -5.2487769209879005),
+                                    ("dd/mmat <time-of-day>", -5.2487769209879005),
+                                    ("<time-of-day> am|pmon <date>", -4.401479060600697),
+                                    ("Thursdaydd/mm", -5.654242029096065),
+                                    ("dayyear", -2.609719591372642),
+                                    ("New Year's Dayyear (latent)", -5.2487769209879005),
+                                    ("Thursdayat <time-of-day>", -4.401479060600697),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.654242029096065),
+                                    ("Aprilyear (latent)", -5.654242029096065),
+                                    ("monthminute", -5.654242029096065),
+                                    ("<time-of-day> am|pmtomorrow", -5.654242029096065),
+                                    ("Thursdayhh:mm", -4.73795129722191),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.654242029096065),
+                                    ("minutemonth", -3.8624825598680097),
+                                    ("Sundayfrom|since|after <time-of-day>", -5.654242029096065),
+                                    ("week-endin <named-month>|year", -5.654242029096065),
+                                    ("Augustyear (latent)", -5.2487769209879005),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.2487769209879005),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.2487769209879005),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.654242029096065),
+                                    ("dd/mm<time-of-day> - <time-of-day> (interval)",
+                                     -5.2487769209879005),
+                                    ("Sundayyear (latent)", -4.96109484853612),
+                                    ("Christmasat <time-of-day>", -5.654242029096065),
+                                    ("dd/mmyear (latent)", -5.654242029096065),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.654242029096065),
+                                    ("yesterday<time-of-day> am|pm", -5.654242029096065),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.73795129722191),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.2487769209879005),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.654242029096065),
+                                    ("until <time-of-day>on <date>", -4.96109484853612),
+                                    ("at <time-of-day>intersect", -5.2487769209879005),
+                                    ("hh:mmyear (latent)", -4.555629740427955),
+                                    ("Holiyear (latent)", -5.654242029096065),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.654242029096065),
+                                    ("dayminute", -3.1693353793080647),
+                                    ("intersectSeptember", -4.1501646323197905),
+                                    ("minuteday", -2.5861890939624477),
+                                    ("absorption of , after named dayintersect",
+                                     -5.654242029096065),
+                                    ("Februaryin|during the <part-of-day>", -5.654242029096065),
+                                    ("hh:mmon <date>", -3.6393390085538),
+                                    ("Saturdayyear (latent)", -5.654242029096065),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -5.654242029096065),
+                                    ("absorption of , after named daySeptember", -4.73795129722191),
+                                    ("Naraka Chaturdashiyear (latent)", -5.654242029096065),
+                                    ("on <date>September", -5.2487769209879005),
+                                    ("at <time-of-day>on <date>", -5.2487769209879005),
+                                    ("in <named-month>|yearyear (latent)", -5.654242029096065),
+                                    ("dayweek", -5.654242029096065),
+                                    ("Easter Sundayyear (latent)", -5.2487769209879005),
+                                    ("Thursday<time-of-day> am|pm", -5.2487769209879005),
+                                    ("absorption of , after named dayFebruary", -4.73795129722191),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.654242029096065),
+                                    ("tomorrowat <time-of-day>", -5.654242029096065),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.654242029096065),
+                                    ("Thursdayfrom|since|after <time-of-day>", -4.044804116661965),
+                                    ("tomorrow<time-of-day> am|pm", -5.654242029096065),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -4.96109484853612),
+                                    ("Diwaliyear (latent)", -5.2487769209879005),
+                                    ("Tuesdayfrom|since|after <time-of-day>", -5.654242029096065),
+                                    ("Fridayyear (latent)", -5.2487769209879005),
+                                    ("minuteyear", -4.401479060600697)],
+                               n = 181}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.2039728043259361,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.19105523676270922),
+                                    ("integer (0..19)", -1.749199854809259)],
+                               n = 21}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.001480000210124),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("hh:mmhh:mm", -2.001480000210124),
+                                    ("dayday", -2.512305623976115),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
+                                    ("hourhour", -2.512305623976115),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.1986731175506815),
+                                    ("dayhour", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.1986731175506815),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -3.1986731175506815),
+                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
+                                    ("minuteminute", -2.793208009442517),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.793208009442517),
+                                    ("dayday", -3.1986731175506815),
+                                    ("hourhour", -2.505525936990736),
+                                    ("dayyear", -3.1986731175506815),
+                                    ("minutehour", -2.2823823856765264),
+                                    ("hh:mmintersect", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -3.1986731175506815)],
+                               n = 14}}),
+       ("Saturday",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekmonth", -1.7346010553881064),
+                                    ("week (grain)October", -1.7346010553881064),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekday", -1.2237754316221157)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6094379124341003),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("hourminute", -2.3025850929940455),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.70805020110221),
+                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.0149030205422647),
+                                    ("hourhour", -1.791759469228055),
+                                    ("minutehour", -1.6094379124341003),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
+                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
+                               n = 4}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mothering Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.15746743245325218,
+                               unseen = -4.897839799950911,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.616204176316249e-2),
+                                    ("intersect 2 numbers", -3.5040547671018634)],
+                               n = 129},
+                   koData =
+                     ClassData{prior = -1.9262373834566084, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3121863889661687),
+                                    ("negative numbers", -0.6190392084062235),
+                                    ("compose by multiplication", -1.8718021769015913)],
+                               n = 22}}),
+       ("Bank Holiday",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Monday",
+        Classifier{okData =
+                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.2237754316221157,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("dd/mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm:ss",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Hanukkah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262),
+                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>integer (numeric)",
+                                     -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9808292530117262),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.0794415416798357),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -1.6739764335716716),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.3862943611198906)],
+                               n = 3}}),
+       ("Valentine's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.0821994520255166e-2,
+                               unseen = -4.304065093204169,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 72},
+                   koData =
+                     ClassData{prior = -3.2188758248682006,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.3513752571634776),
+                                    ("part of daysintersect", -2.3513752571634776),
+                                    ("hourday", -0.9650808960435872),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.3513752571634776),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.3513752571634776),
+                                    ("part of daysthis <time>", -2.3513752571634776),
+                                    ("part of daysChristmas", -1.9459101490553135)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.252762968495368),
+                                    ("one twenty two", -0.8472978603872037),
+                                    ("one eleven", -1.252762968495368)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.3513752571634776),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.3513752571634776),
+                                    ("ordinal (digits)February", -2.3513752571634776),
+                                    ("integer (numeric)February", -1.9459101490553135),
+                                    ("month", -0.9650808960435872),
+                                    ("ordinal (digits)March", -2.3513752571634776),
+                                    ("integer (numeric)July", -2.3513752571634776)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.5040773967762742),
+                                    ("month", -1.5040773967762742)],
+                               n = 1}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3677247801253174,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.5257286443082556),
+                                    ("hour", -0.7339691750802004),
+                                    ("part of days", -0.8209805520698302)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -7.598590697792199e-2,
+                               unseen = -5.093750200806762,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1173044216802621),
+                                    ("month (grain)", -2.7850112422383386),
+                                    ("year (grain)", -2.6026896854443837),
+                                    ("week (grain)", -1.1173044216802621),
+                                    ("quarter", -3.4781584227982836), ("year", -2.6026896854443837),
+                                    ("month", -2.7850112422383386),
+                                    ("quarter (grain)", -3.4781584227982836)],
+                               n = 76},
+                   koData =
+                     ClassData{prior = -2.6149597780361984,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.4816045409242156),
+                                    ("week (grain)", -1.4816045409242156),
+                                    ("day", -1.9924301646902063),
+                                    ("day (grain)", -1.9924301646902063)],
+                               n = 6}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August Bank Holiday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.7047480922384253),
+                                    ("ordinal (digits)", -0.2006706954621511)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("ordinal (digits)", -0.2876820724517809)],
+                               n = 2}}),
+       ("last weekend of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
+                                    ("month", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (number)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("Chinese New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.5699145401359973, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.11778303565638351),
+                                    ("integer (0..19)", -2.330755969960742)],
+                               n = 69},
+                   koData =
+                     ClassData{prior = -0.8337291311811348, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.352605801082348e-2),
+                                    ("integer (0..19)", -2.9267394020670396),
+                                    ("integer 21..99", -3.332204510175204)],
+                               n = 53}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -1.6094379124341003),
+                                    ("MondayMarch", -1.6094379124341003),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.13858616328614667,
+                               unseen = -5.147494476813453,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5026062268874014),
+                                    ("integer (0..19)year (grain)", -3.062222014822824),
+                                    ("integer (numeric)day (grain)", -2.743768283704289),
+                                    ("integer (0..19)second (grain) ", -3.7553691953827695),
+                                    ("integer (0..19)hour (grain)", -3.062222014822824),
+                                    ("second", -3.349904087274605),
+                                    ("integer (numeric)second (grain) ", -4.04305126783455),
+                                    ("integer (numeric)year (grain)", -3.349904087274605),
+                                    ("day", -2.4336133554004498), ("year", -2.576714199041123),
+                                    ("integer (numeric)week (grain)", -3.062222014822824),
+                                    ("integer (0..19)month (grain)", -3.5322256440685593),
+                                    ("hour", -2.6567569067146595), ("month", -3.1957534074473464),
+                                    ("integer (numeric)minute (grain)", -3.1957534074473464),
+                                    ("integer (0..19)minute (grain)", -3.062222014822824),
+                                    ("integer (numeric)month (grain)", -4.04305126783455),
+                                    ("minute", -2.5026062268874014),
+                                    ("integer (numeric)hour (grain)", -3.5322256440685593),
+                                    ("integer (0..19)day (grain)", -3.5322256440685593),
+                                    ("integer (0..19)week (grain)", -3.1957534074473464)],
+                               n = 74},
+                   koData =
+                     ClassData{prior = -2.044755983691946, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
+                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
+                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
+                               n = 11}}),
+       ("hhmm (latent)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -5.342334251964811,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.951243718581427),
+                                    ("at <time-of-day>", -2.202043863772168),
+                                    ("from|since|after <time-of-day>", -3.7281001672672174),
+                                    ("<time-of-day> o'clock", -4.238925791033208),
+                                    ("half after|past <hour-of-day>", -4.238925791033208),
+                                    ("time-of-day (latent)", -1.7266201670570935),
+                                    ("hhmm (latent)", -4.6443908991413725),
+                                    ("hh:mm", -2.293015641977895),
+                                    ("quarter after|past <hour-of-day>", -4.6443908991413725),
+                                    ("about|exactly <time-of-day>", -4.6443908991413725),
+                                    ("until <time-of-day>", -3.951243718581427),
+                                    ("hour", -1.2104036946562264),
+                                    ("<time-of-day> sharp|exactly", -4.6443908991413725),
+                                    ("minute", -1.754019141245208)],
+                               n = 96},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -4.394449154672439,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
+                                    ("from|since|after <time-of-day>", -3.283414346005772),
+                                    ("<hour-of-day> <integer>", -3.6888794541139363),
+                                    ("time-of-day (latent)", -1.0498221244986778),
+                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
+                               n = 32}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
+                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
+                                    ("month", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thanksgiving Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Guy Fawkes Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1400661634962708),
+                                    ("year (grain)", -2.4277482359480516),
+                                    ("second", -2.833213344056216),
+                                    ("week (grain)", -2.1400661634962708),
+                                    ("day", -2.1400661634962708),
+                                    ("minute (grain)", -2.833213344056216),
+                                    ("year", -2.4277482359480516),
+                                    ("second (grain) ", -2.833213344056216),
+                                    ("minute", -2.833213344056216),
+                                    ("day (grain)", -2.1400661634962708)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.8873031950009028, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -1.7227665977411035),
+                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
+                                    ("quarter (grain)", -1.9459101490553135)],
+                               n = 7}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -0.6931471805599453),
+                                    ("year", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -4.255961441879589e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
+                   koData =
+                     ClassData{prior = -3.1780538303479458,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Rosh Hashanah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dd/mm", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.2992829841302609),
+                                    ("Marcha <unit-of-duration>", -1.7047480922384253),
+                                    ("March<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayyear", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -5.081404364984463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.382026634673881),
+                                    ("dayhour", -3.1292636661785136),
+                                    ("daymonth", -3.1292636661785136),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.382026634673881),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.6888794541139363),
+                                    ("Wednesdayintersect", -4.382026634673881),
+                                    ("Black Fridaythis|last|next <cycle>", -4.382026634673881),
+                                    ("<part-of-day> of <time>February", -4.382026634673881),
+                                    ("Saturday<time-of-day> am|pm", -4.382026634673881),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -3.9765615265657175),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.382026634673881),
+                                    ("on <date><time-of-day> am|pm", -4.382026634673881),
+                                    ("hourmonth", -4.382026634673881),
+                                    ("dayday", -2.5102244577722903),
+                                    ("the <day-of-month> (ordinal)February", -3.9765615265657175),
+                                    ("WednesdayOctober", -4.382026634673881),
+                                    ("Wednesdaythis|last|next <cycle>", -3.9765615265657175),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.4657359027997265),
+                                    ("dayyear", -2.8779492378976075),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.382026634673881),
+                                    ("Thursdayhh:mm", -3.9765615265657175),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.382026634673881),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -3.9765615265657175),
+                                    ("TuesdayOctober", -4.382026634673881),
+                                    ("the <day-of-month> (ordinal)March", -4.382026634673881),
+                                    ("Mondaythis|last|next <cycle>", -4.382026634673881),
+                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.382026634673881),
+                                    ("Fridayintersect", -4.382026634673881),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -3.6888794541139363),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.4657359027997265),
+                                    ("Tuesdaythis|last|next <cycle>", -4.382026634673881),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.382026634673881),
+                                    ("dayminute", -2.995732273553991),
+                                    ("minuteday", -3.4657359027997265),
+                                    ("this|last|next <cycle>Sunday", -4.382026634673881),
+                                    ("intersectyear (latent)", -4.382026634673881),
+                                    ("Sundaythis|last|next <cycle>", -4.382026634673881),
+                                    ("weekday", -4.382026634673881),
+                                    ("dayweek", -3.283414346005772),
+                                    ("Thursday<time-of-day> am|pm", -4.382026634673881),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -3.9765615265657175),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -3.9765615265657175)],
+                               n = 50},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -4.795790545596741,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.0943445622221),
+                                    ("week-endOctober", -3.4011973816621555),
+                                    ("daymonth", -1.8971199848858813),
+                                    ("TuesdaySeptember", -4.0943445622221),
+                                    ("Wednesdayintersect", -4.0943445622221),
+                                    ("hourmonth", -2.995732273553991),
+                                    ("Fridaythis|last|next <cycle>", -4.0943445622221),
+                                    ("SundayFebruary", -4.0943445622221),
+                                    ("WednesdayOctober", -4.0943445622221),
+                                    ("week-endintersect", -4.0943445622221),
+                                    ("dayyear", -4.0943445622221),
+                                    ("FridayJuly", -3.6888794541139363),
+                                    ("FridaySeptember", -4.0943445622221),
+                                    ("WednesdayFebruary", -4.0943445622221),
+                                    ("minutemonth", -3.1780538303479458),
+                                    ("SundayMarch", -4.0943445622221),
+                                    ("MondayFebruary", -3.6888794541139363),
+                                    ("Fridayintersect", -4.0943445622221),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.6888794541139363),
+                                    ("dayminute", -3.4011973816621555),
+                                    ("SaturdaySeptember", -4.0943445622221),
+                                    ("intersectSeptember", -3.1780538303479458),
+                                    ("MondayMarch", -4.0943445622221),
+                                    ("on <date>September", -3.6888794541139363),
+                                    ("Tuesdayintersect", -4.0943445622221),
+                                    ("Sundayintersect", -4.0943445622221)],
+                               n = 30}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.772588722239781),
+                                    ("Martin Luther King's Day", -2.772588722239781),
+                                    ("Mothering Sunday", -2.772588722239781),
+                                    ("day", -1.1631508098056809), ("Sunday", -2.772588722239781),
+                                    ("Chinese New Year", -2.367123614131617),
+                                    ("Thanksgiving Day", -2.772588722239781),
+                                    ("Easter Sunday", -2.772588722239781),
+                                    ("hour", -2.772588722239781), ("Tuesday", -2.772588722239781),
+                                    ("week-end", -2.772588722239781)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.8873031950009028, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.5649493574615367), ("day", -2.159484249353372),
+                                    ("Sunday", -2.5649493574615367), ("hour", -1.466337068793427),
+                                    ("week-end", -1.466337068793427)],
+                               n = 7}}),
+       ("March",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.120263536200091),
+                                    ("Thursdayordinal (digits)", -2.5257286443082556),
+                                    ("day", -2.120263536200091),
+                                    ("Augustordinal (digits)", -2.5257286443082556),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.120263536200091),
+                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
+                                    ("month", -1.2729656758128873),
+                                    ("Marchordinal (digits)", -2.5257286443082556)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time-of-day>ordinal (digits)",
+                                     -1.8718021769015913),
+                                    ("Augustordinal (digits)", -1.8718021769015913),
+                                    ("month", -1.466337068793427)],
+                               n = 2}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -2.3025850929940455),
+                                    ("<time-of-day> am|pm", -1.6094379124341003),
+                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
+                                    ("minute", -1.3862943611198906)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7227665977411035),
+                                    ("yesterday", -2.2335922215070942),
+                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
+                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
+                               n = 10}}),
+       ("dd.mm.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -2.803360380906535),
+                                    ("a <unit-of-duration>Christmas", -2.803360380906535),
+                                    ("dayday", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>today", -2.803360380906535),
+                                    ("daysecond", -2.803360380906535),
+                                    ("a <unit-of-duration>right now", -2.803360380906535),
+                                    ("minutenograin", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>Christmas", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -2.803360380906535),
+                                    ("secondnograin", -2.803360380906535),
+                                    ("yearday", -2.1102132003465894),
+                                    ("daynograin", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>now", -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.4423470353692043),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.4423470353692043),
+                                    ("dayday", -2.03688192726104),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.4423470353692043),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.4423470353692043)],
+                               n = 3}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.803360380906535),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.803360380906535),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
+                                    ("integer (numeric)this|last|next <cycle>",
+                                     -2.3978952727983707),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("integer (numeric)February", -2.3978952727983707),
+                                    ("month", -0.9315582040049435),
+                                    ("ordinal (digits)March", -2.803360380906535),
+                                    ("integer (numeric)July", -2.803360380906535)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.7047480922384253),
+                                    ("month", -1.7047480922384253)],
+                               n = 1}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.803360380906535),
+                                    ("Halloween", -2.803360380906535),
+                                    ("Wednesday", -2.803360380906535),
+                                    ("Boss's Day", -2.803360380906535),
+                                    ("Mothering Sunday", -2.803360380906535),
+                                    ("Monday", -2.803360380906535), ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -2.803360380906535),
+                                    ("March", -2.803360380906535), ("month", -2.803360380906535),
+                                    ("Tuesday", -2.1102132003465894)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> sharp|exactly",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.1400661634962708),
+                                    ("time-of-day (latent)", -2.1400661634962708),
+                                    ("hhmm (latent)", -2.1400661634962708),
+                                    ("<time-of-day> am|pm", -2.1400661634962708),
+                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
+                                    ("minute", -1.4469189829363254)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -2.4423470353692043),
+                                    ("year (latent)", -1.0560526742493137),
+                                    ("year", -1.0560526742493137), ("March", -2.4423470353692043),
+                                    ("month", -2.03688192726104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.2992829841302609),
+                                    ("year (latent)", -1.7047480922384253),
+                                    ("year", -1.7047480922384253), ("month", -1.2992829841302609)],
+                               n = 3}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -7.696104113612832e-2),
+                                    ("integer (0..19)", -2.6026896854443837)],
+                               n = 25}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> before last|after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
+                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by the end of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hhmm (military) am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.1918471524802814),
+                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
+                                    ("minuteminute", -1.457246097092175),
+                                    ("hh:mmhh:mm", -2.093234863812172),
+                                    ("dayday", -3.1918471524802814),
+                                    ("hourhour", -2.093234863812172),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
+                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -3.1135153092103742),
+                                    ("daymonth", -2.70805020110221),
+                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
+                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
+                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
+                                    ("minuteminute", -1.8607523407150064),
+                                    ("hourhour", -2.70805020110221),
+                                    ("minutehour", -2.70805020110221),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -3.1135153092103742),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.1135153092103742)],
+                               n = 12}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Day",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.529395204760564),
+                                    ("hh:mmhh:mm", -1.8971199848858813),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.4849066497880004),
+                                    ("hourhour", -1.6964492894237302),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -3.4011973816621555),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.4011973816621555),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
+                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
+                                    ("hourhour", -2.2129729343043585),
+                                    ("minutehour", -1.2144441041932315),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.4657359027997265),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -2.5494451709255714),
+                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.0602707946915624)],
+                               n = 24}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.42121346507630353,
+                               unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5455312716044354),
+                                    ("Marchinteger (numeric)", -2.833213344056216),
+                                    ("Aprilinteger (numeric)", -3.2386784521643803),
+                                    ("month", -0.8407831793660099),
+                                    ("Februaryinteger (numeric)", -1.9859154836690123),
+                                    ("Septemberinteger (numeric)", -2.833213344056216),
+                                    ("Octoberinteger (numeric)", -2.833213344056216),
+                                    ("Julyinteger (numeric)", -2.1400661634962708)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time-of-day>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.2512917986064953),
+                                    ("Wednesday", -2.2512917986064953),
+                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
+                                    ("Tuesday", -1.55814461804655)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.791759469228055),
+                                    ("daymonth", -1.2809338454620642),
+                                    ("day (grain)intersect", -1.791759469228055),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("week (grain)intersect", -2.1972245773362196),
+                                    ("week (grain)September", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("right now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("for <duration> from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -1.5040773967762742),
+                                    ("dayday", -1.0986122886681098),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.252762968495368)],
+                               n = 1}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.832909122935104),
+                                    ("hh:mmhh:mm", -0.832909122935104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
+                                    ("minuteminute", -1.410986973710262),
+                                    ("minutehour", -1.410986973710262),
+                                    ("hh:mmintersect", -1.410986973710262)],
+                               n = 18}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -3.509131981127006e-2,
+                               unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
+                   koData =
+                     ClassData{prior = -3.367295829986474, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.791759469228055),
+                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.1972245773362196),
+                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
+                                    ("month", -0.9444616088408514),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("August",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}})]
diff --git a/Duckling/Ranking/Classifiers/EN_US.hs b/Duckling/Ranking/Classifiers/EN_US.hs
--- a/Duckling/Ranking/Classifiers/EN_US.hs
+++ b/Duckling/Ranking/Classifiers/EN_US.hs
@@ -21,2389 +21,3114 @@
 classifiers :: Classifiers
 classifiers
   = HashMap.fromList
-      [("<integer> to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.7765287894989963, unseen = -5.225746673713201,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 184},
-                   koData =
-                     ClassData{prior = -0.616186139423817, unseen = -5.384495062789089,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 216}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6094379124341003),
-                                    ("dayday", -1.0986122886681098),
-                                    ("day (grain)yesterday", -1.6094379124341003)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.466337068793427),
-                                    ("year (grain)Christmas", -1.8718021769015913),
-                                    ("day (grain)intersect", -1.466337068793427),
-                                    ("yearday", -1.8718021769015913)],
-                               n = 3}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("integer after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8109302162163288),
-                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
-                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -2.1400661634962708),
-                                    ("ordinal (digits)February", -2.1400661634962708),
-                                    ("integer (numeric)April", -2.1400661634962708),
-                                    ("month", -1.4469189829363254)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.844007281325252e-2,
-                               unseen = -4.430816798843313,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("dayhour", -1.5284688499004333),
-                                    ("Mondayearly morning", -3.3202283191284883),
-                                    ("time-of-day (latent)tonight", -3.3202283191284883),
-                                    ("hourhour", -2.339399066116762),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("todaypart of days", -3.7256934272366524),
-                                    ("minutehour", -2.627081138568543),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.3202283191284883),
-                                    ("time-of-day (latent)this <part-of-day>", -3.7256934272366524),
-                                    ("Mondayin|during the <part-of-day>", -3.7256934272366524),
-                                    ("intersectpart of days", -3.7256934272366524),
-                                    ("intersectin|during the <part-of-day>", -3.7256934272366524),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("tomorrowpart of days", -2.339399066116762),
-                                    ("hh:mmin|during the <part-of-day>", -3.0325462466767075),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("yesterdaypart of days", -3.7256934272366524),
-                                    ("Mondaypart of days", -3.7256934272366524)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -2.367123614131617, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.740840023925201),
-                                    ("monthhour", -2.740840023925201),
-                                    ("hourhour", -2.740840023925201),
-                                    ("past year (latent)in|during the <part-of-day>",
-                                     -2.740840023925201),
-                                    ("Februaryin|during the <part-of-day>", -2.740840023925201),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.740840023925201)],
-                               n = 3}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -1.4271163556401458,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.2744368457017603, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.381875521765486e-2,
-                               unseen = -4.90527477843843,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.7992275112828016),
-                                    ("noon|midnight|EOD|end of day", -3.7992275112828016),
-                                    ("integer after|past <hour-of-day>", -3.7992275112828016),
-                                    ("half after|past <hour-of-day>", -4.204692619390966),
-                                    ("time-of-day (latent)", -1.7197859696029658),
-                                    ("hhmm (latent)", -3.5115454388310208),
-                                    ("<time-of-day> am|pm", -1.8067973465925955),
-                                    ("hh:mm", -3.288401887516811),
-                                    ("about|exactly <time-of-day>", -3.7992275112828016),
-                                    ("hour", -1.0911773101805915),
-                                    ("<time-of-day> sharp|exactly", -4.204692619390966),
-                                    ("minute", -2.0074680420547466)],
-                               n = 61},
-                   koData =
-                     ClassData{prior = -2.412933150162911, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.791759469228055), ("mm/dd", -3.295836866004329),
-                                    ("absorption of , after named day", -2.890371757896165),
-                                    ("intersect", -2.890371757896165),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Friday", -3.295836866004329), ("day", -0.8979415932059586),
-                                    ("the <day-of-month> (ordinal)", -2.890371757896165),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.6026896854443837),
-                                    ("hour", -3.295836866004329)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -1.8718021769015913,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.916290731874155),
-                                    ("hh:mmhh:mm", -0.916290731874155)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.916290731874155),
-                                    ("minutehour", -0.916290731874155)],
-                               n = 3}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from|since|after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("July", -3.3141860046725258),
-                                    ("time-of-day (latent)", -2.3978952727983707),
-                                    ("<time-of-day> am|pm", -2.3978952727983707),
-                                    ("hh:mm", -2.3978952727983707), ("hour", -1.8101086078962516),
-                                    ("month", -2.908720896564361), ("minute", -2.3978952727983707),
-                                    ("August", -3.3141860046725258)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -4.836281906951478,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.7297014486341915),
-                                    ("week", -4.135166556742356),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.135166556742356),
-                                    ("today", -4.135166556742356),
-                                    ("intersect", -2.7488721956224653),
-                                    ("second", -4.135166556742356), ("now", -3.4420193761824103),
-                                    ("tomorrow", -3.7297014486341915),
-                                    ("this|last|next <cycle>", -4.135166556742356),
-                                    ("day", -1.995100393246085),
-                                    ("time-of-day (latent)", -4.135166556742356),
-                                    ("<time-of-day> am|pm", -3.7297014486341915),
-                                    ("nograin", -3.4420193761824103),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.135166556742356),
-                                    ("Christmas", -3.4420193761824103),
-                                    ("hour", -2.8824035882469876),
-                                    ("<datetime> - <datetime> (interval)", -2.7488721956224653),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.430418464503931),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -3.7297014486341915),
-                                    ("minute", -1.6928195213731514),
-                                    ("right now", -4.135166556742356),
-                                    ("<month> dd-dd (interval)", -3.4420193761824103),
-                                    ("dd-dd <month> (interval)", -3.7297014486341915)],
-                               n = 49}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -4.652001563489282e-2,
-                               unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.2188758248682006),
-                                    ("<integer> more <unit-of-duration>", -3.912023005428146),
-                                    ("three-quarters of an hour", -2.995732273553991),
-                                    ("<integer> + '\"", -3.2188758248682006),
-                                    ("number.number hours", -3.912023005428146),
-                                    ("second", -3.506557897319982), ("day", -3.2188758248682006),
-                                    ("half an hour", -2.995732273553991),
-                                    ("<integer> <unit-of-duration>", -1.6094379124341003),
-                                    ("a <unit-of-duration>", -2.995732273553991),
-                                    ("quarter of an hour", -2.995732273553991),
-                                    ("hour", -2.5257286443082556),
-                                    ("about|exactly <duration>", -3.912023005428146),
-                                    ("<integer> and an half hour", -3.912023005428146),
-                                    ("minute", -1.2729656758128873)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -3.0910424533583156, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -1.8971199848858813),
-                                    ("<integer> <unit-of-duration>", -2.3025850929940455),
-                                    ("a <unit-of-duration>", -2.3025850929940455)],
-                               n = 2}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.8209805520698302,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.4957877464014501, unseen = -6.293419278846481,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("hourday", -3.8936738667599493),
-                                    ("dayhour", -2.765208614942159),
-                                    ("daymonth", -4.90527477843843),
-                                    ("monthday", -5.19295685089021),
-                                    ("monthyear", -3.9889840465642745),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.598421958998375),
-                                    ("Christmasyear", -5.598421958998375),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.598421958998375),
-                                    ("houryear", -5.598421958998375),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.90527477843843),
-                                    ("<time-of-day> am|pmintersect", -4.345658990503007),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -5.598421958998375),
-                                    ("Marchyear", -5.598421958998375),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
-                                     -5.19295685089021),
-                                    ("intersect<time-of-day> am|pm", -5.598421958998375),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.598421958998375),
-                                    ("monthhour", -5.19295685089021),
-                                    ("last <day-of-week> of <time>year", -5.598421958998375),
-                                    ("todayat <time-of-day>", -5.598421958998375),
-                                    ("Thursday<time> timezone", -3.8936738667599493),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("dayday", -3.58351893845611),
-                                    ("Thanksgiving Dayyear", -4.499809670330265),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.598421958998375),
-                                    ("Tuesdayin <named-month>", -5.598421958998375),
-                                    ("mm/ddat <time-of-day>", -5.598421958998375),
-                                    ("tonightat <time-of-day>", -5.598421958998375),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -4.90527477843843),
-                                    ("today<time-of-day> am|pm", -5.598421958998375),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.19295685089021),
-                                    ("at <time-of-day><time> <part-of-day>", -5.598421958998375),
-                                    ("mm/dd<time-of-day> am|pm", -5.598421958998375),
-                                    ("hourhour", -4.345658990503007),
-                                    ("<time-of-day> am|pmon <date>", -3.58351893845611),
-                                    ("Wednesdaythis|last|next <cycle>", -5.598421958998375),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.0943445622221),
-                                    ("dayyear", -3.1560749236291703),
-                                    ("last weekend of <named-month>year", -5.598421958998375),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursdayat <time-of-day>", -5.19295685089021),
-                                    ("<time-of-day> am|pmtomorrow", -4.90527477843843),
-                                    ("minutehour", -4.68213122712422),
-                                    ("Mother's Dayyear", -5.598421958998375),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.19295685089021),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -3.8936738667599493),
-                                    ("for <duration> from <time>December", -5.598421958998375),
-                                    ("tomorrow<time-of-day> sharp|exactly", -5.598421958998375),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.19295685089021),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.68213122712422),
-                                    ("Mondayin|during the <part-of-day>", -5.598421958998375),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.19295685089021),
-                                    ("intersectin|during the <part-of-day>", -5.598421958998375),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.345658990503007),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -4.68213122712422),
-                                    ("at <time-of-day>intersect", -5.19295685089021),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.598421958998375),
-                                    ("dayminute", -2.924273309571846),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.19295685089021),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.19295685089021),
-                                    ("<ordinal> <cycle> of <time>year", -5.598421958998375),
-                                    ("minuteday", -2.132686056198648),
-                                    ("absorption of , after named dayintersect",
-                                     -5.598421958998375),
-                                    ("Octoberyear", -4.345658990503007),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -5.598421958998375),
-                                    ("<day-of-month> (ordinal or number) <named-month>year",
-                                     -5.598421958998375),
-                                    ("year<time-of-day> am|pm", -5.598421958998375),
-                                    ("Septemberyear", -5.19295685089021),
-                                    ("at <time-of-day>on <date>", -4.499809670330265),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("Halloweenyear", -5.598421958998375),
-                                    ("dayweek", -5.598421958998375),
-                                    ("Thursday<time-of-day> am|pm", -5.598421958998375),
-                                    ("weekyear", -5.19295685089021),
-                                    ("hh:mmin|during the <part-of-day>", -4.90527477843843),
-                                    ("Father's Dayyear", -5.598421958998375),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.19295685089021),
-                                    ("February<time> <part-of-day>", -5.598421958998375),
-                                    ("Martin Luther King's Dayyear", -5.19295685089021),
-                                    ("tomorrowat <time-of-day>", -4.90527477843843),
-                                    ("between <time> and <time>on <date>", -4.90527477843843),
-                                    ("Thursdayfrom|since|after <time-of-day>", -4.90527477843843),
-                                    ("at <time-of-day>tomorrow", -5.19295685089021),
-                                    ("tomorrow<time-of-day> am|pm", -5.598421958998375),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -5.598421958998375),
-                                    ("Labor Dayyear", -5.598421958998375),
-                                    ("Februaryintersect", -5.598421958998375),
-                                    ("last <cycle> of <time>year", -4.90527477843843),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -5.598421958998375),
-                                    ("yearminute", -5.598421958998375),
-                                    ("Black Fridayyear", -5.19295685089021)],
-                               n = 201},
-                   koData =
-                     ClassData{prior = -0.9392802500988537, unseen = -5.983936280687191,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("in <named-month>year", -5.288267030694535),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.288267030694535),
-                                    ("hourday", -5.288267030694535),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.288267030694535),
-                                    ("dayhour", -2.890371757896165),
-                                    ("daymonth", -3.2088254890146994),
-                                    ("monthday", -4.882801922586371),
-                                    ("monthyear", -4.59511985013459),
-                                    ("intersecthh:mm", -5.288267030694535),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.288267030694535),
-                                    ("houryear", -5.288267030694535),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.288267030694535),
-                                    ("until <time-of-day><time-of-day> am|pm", -5.288267030694535),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.59511985013459),
-                                    ("<time-of-day> am|pmintersect", -4.035504062199167),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.37197629882038),
-                                    ("from|since|after <time-of-day>on <date>", -4.37197629882038),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("absorption of , after named dayJuly", -4.882801922586371),
-                                    ("monthhour", -5.288267030694535),
-                                    ("hourmonth", -4.59511985013459),
-                                    ("todayat <time-of-day>", -5.288267030694535),
-                                    ("from|since|after <time-of-day>July", -5.288267030694535),
-                                    ("dayday", -4.882801922586371),
-                                    ("mm/ddat <time-of-day>", -4.882801922586371),
-                                    ("<time-of-day> am|pmon <date>", -4.035504062199167),
-                                    ("dayyear", -4.035504062199167),
-                                    ("Thursdaymm/dd", -5.288267030694535),
-                                    ("Thursdayat <time-of-day>", -4.035504062199167),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.288267030694535),
-                                    ("monthminute", -5.288267030694535),
-                                    ("<time-of-day> am|pmtomorrow", -5.288267030694535),
-                                    ("Thursdayhh:mm", -4.37197629882038),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("Fridayyear", -4.882801922586371),
-                                    ("minutemonth", -3.4965075614664802),
-                                    ("Sundayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.882801922586371),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("Aprilyear", -5.288267030694535),
-                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.288267030694535),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.288267030694535),
-                                    ("yesterday<time-of-day> am|pm", -5.288267030694535),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -4.37197629882038),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.288267030694535),
-                                    ("until <time-of-day>on <date>", -4.59511985013459),
-                                    ("at <time-of-day>intersect", -4.882801922586371),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("dayminute", -2.7625383863862796),
-                                    ("intersectSeptember", -3.784189633918261),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("minuteday", -2.3704962986102562),
-                                    ("absorption of , after named dayintersect",
-                                     -5.288267030694535),
-                                    ("Februaryin|during the <part-of-day>", -5.288267030694535),
-                                    ("week-endin <named-month>", -5.288267030694535),
-                                    ("Octoberyear", -5.288267030694535),
-                                    ("from|since|after <time-of-day>year", -5.288267030694535),
-                                    ("yearhh:mm", -5.288267030694535),
-                                    ("hh:mmon <date>", -3.784189633918261),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -5.288267030694535),
-                                    ("absorption of , after named daySeptember", -4.37197629882038),
-                                    ("on <date>September", -4.882801922586371),
-                                    ("at <time-of-day>on <date>", -4.882801922586371),
-                                    ("dayweek", -5.288267030694535),
-                                    ("Thursday<time-of-day> am|pm", -4.882801922586371),
-                                    ("absorption of , after named dayFebruary", -4.37197629882038),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.288267030694535),
-                                    ("tomorrowat <time-of-day>", -5.288267030694535),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.288267030694535),
-                                    ("Thursdayfrom|since|after <time-of-day>", -3.6788291182604347),
-                                    ("tomorrow<time-of-day> am|pm", -5.288267030694535),
-                                    ("Tuesdayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("yearminute", -5.288267030694535)],
-                               n = 129}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.16251892949777494),
-                                    ("integer (0..19)", -1.8971199848858813)],
-                               n = 18}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.0149030205422647),
-                                    ("quarteryear", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.0149030205422647),
-                                    ("weekmonth", -1.6094379124341003),
-                                    ("ordinal (digits)quarter (grain)year", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)past year (latent)",
-                                     -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd/yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>integer (numeric)",
-                                     -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 1}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.9808292530117262),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -2.0794415416798357),
-                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
-                                     -1.6739764335716716),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
-                                     -1.6739764335716716)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.0986122886681098),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
-                                     -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
-                                     -1.3862943611198906)],
-                               n = 3}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.6094379124341003),
-                                    ("hourday", -0.916290731874155),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -1.6094379124341003),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("past year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15822400521489416,
-                               unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5488132906176655),
-                                    ("month (grain)", -2.995732273553991),
-                                    ("year (grain)", -1.817077277212345),
-                                    ("week (grain)", -1.5488132906176655),
-                                    ("quarter", -2.772588722239781), ("year", -1.817077277212345),
-                                    ("month", -2.995732273553991),
-                                    ("quarter (grain)", -2.772588722239781)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -1.9218125974762528,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.4816045409242156),
-                                    ("week (grain)", -1.4816045409242156),
-                                    ("day", -1.9924301646902063),
-                                    ("day (grain)", -1.9924301646902063)],
-                               n = 6}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -2.1972245773362196),
-                                    ("end of month", -2.1972245773362196),
-                                    ("time-of-day (latent)", -2.1972245773362196),
-                                    ("<time-of-day> am|pm", -2.1972245773362196),
-                                    ("hh:mm", -2.1972245773362196), ("hour", -1.791759469228055),
-                                    ("month", -2.1972245773362196), ("minute", -1.791759469228055)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2006706954621511,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.7047480922384253,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("ordinal (digits)", -0.2876820724517809)],
-                               n = 2}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.5315058290035293,
-                               unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.12136085700426748),
-                                    ("integer (0..19)", -2.3025850929940455)],
-                               n = 67},
-                   koData =
-                     ClassData{prior = -0.8860508466844369,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.10536051565782628),
-                                    ("integer (0..19)", -2.8134107167600364),
-                                    ("integer 21..99", -3.2188758248682006)],
-                               n = 47}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.23483959107740107, unseen = -3.58351893845611,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -1.563975538357343, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 9}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.1479201300766222,
-                               unseen = -5.0875963352323845,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4423470353692043),
-                                    ("integer (0..19)year (grain)", -3.289644895756408),
-                                    ("integer (numeric)day (grain)", -2.6835090921860925),
-                                    ("integer (0..19)second (grain) ", -3.6951100038645723),
-                                    ("integer (0..19)hour (grain)", -3.001962823304627),
-                                    ("second", -3.289644895756408),
-                                    ("integer (numeric)second (grain) ", -3.982792076316353),
-                                    ("integer (numeric)year (grain)", -3.6951100038645723),
-                                    ("day", -2.4423470353692043), ("year", -2.8841797876482436),
-                                    ("integer (numeric)week (grain)", -3.001962823304627),
-                                    ("integer (0..19)month (grain)", -3.4719664525503626),
-                                    ("hour", -2.5964977151964628), ("month", -3.1354942159291497),
-                                    ("integer (numeric)minute (grain)", -3.1354942159291497),
-                                    ("integer (0..19)minute (grain)", -3.001962823304627),
-                                    ("integer (numeric)month (grain)", -3.982792076316353),
-                                    ("minute", -2.4423470353692043),
-                                    ("integer (numeric)hour (grain)", -3.4719664525503626),
-                                    ("integer (0..19)day (grain)", -3.6951100038645723),
-                                    ("integer (0..19)week (grain)", -3.1354942159291497)],
-                               n = 69},
-                   koData =
-                     ClassData{prior = -1.984131361875511, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2929871246814741,
-                               unseen = -5.3230099791384085,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer after|past <hour-of-day>", -3.9318256327243257),
-                                    ("at <time-of-day>", -2.2270775404859005),
-                                    ("from|since|after <time-of-day>", -3.708682081410116),
-                                    ("<time-of-day> o'clock", -4.219507705176107),
-                                    ("half after|past <hour-of-day>", -4.219507705176107),
-                                    ("time-of-day (latent)", -1.7346010553881064),
-                                    ("hhmm (latent)", -4.624972813284271),
-                                    ("hh:mm", -2.2735975561207935),
-                                    ("quarter after|past <hour-of-day>", -4.624972813284271),
-                                    ("about|exactly <time-of-day>", -4.624972813284271),
-                                    ("until <time-of-day>", -3.9318256327243257),
-                                    ("hour", -1.2237754316221157),
-                                    ("<time-of-day> sharp|exactly", -4.624972813284271),
-                                    ("minute", -1.7346010553881064)],
-                               n = 94},
-                   koData =
-                     ClassData{prior = -1.3705460041517514, unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
-                                    ("from|since|after <time-of-day>", -3.283414346005772),
-                                    ("<hour-of-day> <integer>", -3.6888794541139363),
-                                    ("time-of-day (latent)", -1.0498221244986778),
-                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
-                               n = 32}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5753641449035618,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("year (grain)", -2.772588722239781),
-                                    ("second", -2.772588722239781),
-                                    ("week (grain)", -2.0794415416798357),
-                                    ("day", -2.0794415416798357),
-                                    ("minute (grain)", -2.772588722239781),
-                                    ("year", -2.772588722239781),
-                                    ("second (grain) ", -2.772588722239781),
-                                    ("minute", -2.772588722239781),
-                                    ("day (grain)", -2.0794415416798357)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.8266785731844679, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -6.782259633876106e-2,
-                               unseen = -4.07753744390572,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 57},
-                   koData =
-                     ClassData{prior = -2.7245795030534206, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.639057329615259),
-                                    ("this|last|next <cycle>", -2.639057329615259),
-                                    ("day", -2.2335922215070942),
-                                    ("time-of-day (latent)", -2.639057329615259),
-                                    ("hhmm (latent)", -2.2335922215070942),
-                                    ("<time-of-day> am|pm", -2.639057329615259),
-                                    ("hour", -1.9459101490553135),
-                                    ("next <time>", -2.639057329615259),
-                                    ("this|next <day-of-week>", -2.639057329615259),
-                                    ("minute", -2.2335922215070942)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.48130318449966897,
-                               unseen = -5.170483995038151,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayhour", -3.2188758248682006),
-                                    ("daymonth", -3.2188758248682006),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.471638793363569),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.7784916128036232),
-                                    ("Wednesdayintersect", -4.471638793363569),
-                                    ("Labor Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Black Fridaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.471638793363569),
-                                    ("<part-of-day> of <time>February", -4.471638793363569),
-                                    ("Saturday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -4.471638793363569),
-                                    ("on <date><time-of-day> am|pm", -4.471638793363569),
-                                    ("hourmonth", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.471638793363569),
-                                    ("dayday", -2.5998366164619773),
-                                    ("the <day-of-month> (ordinal)February", -4.0661736852554045),
-                                    ("WednesdayOctober", -4.471638793363569),
-                                    ("Wednesdaythis|last|next <cycle>", -4.0661736852554045),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.5553480614894135),
-                                    ("dayyear", -2.8622008809294686),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.471638793363569),
-                                    ("Thursdayhh:mm", -4.0661736852554045),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Memorial Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("TuesdayOctober", -4.471638793363569),
-                                    ("the <day-of-month> (ordinal)March", -4.471638793363569),
-                                    ("Mondaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.0661736852554045),
-                                    ("Fridayintersect", -4.471638793363569),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.7784916128036232),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.5553480614894135),
-                                    ("Tuesdaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayminute", -2.6798793241355137),
-                                    ("intersectyear", -4.471638793363569),
-                                    ("minuteday", -3.5553480614894135),
-                                    ("this|last|next <cycle>Sunday", -4.471638793363569),
-                                    ("Sundaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersectintersect", -4.471638793363569),
-                                    ("weekday", -4.471638793363569),
-                                    ("dayweek", -3.373026504695459),
-                                    ("Thursday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -4.0661736852554045)],
-                               n = 55},
-                   koData =
-                     ClassData{prior = -0.9622758451159785, unseen = -4.897839799950911,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.197201947661808),
-                                    ("week-endOctober", -3.5040547671018634),
-                                    ("daymonth", -1.9999773703255892),
-                                    ("TuesdaySeptember", -4.197201947661808),
-                                    ("Wednesdayintersect", -4.197201947661808),
-                                    ("hourmonth", -3.0985896589936988),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.197201947661808),
-                                    ("Fridaythis|last|next <cycle>", -4.197201947661808),
-                                    ("SundayFebruary", -4.197201947661808),
-                                    ("WednesdayOctober", -4.197201947661808),
-                                    ("week-endintersect", -4.197201947661808),
-                                    ("dayyear", -4.197201947661808),
-                                    ("FridayJuly", -3.791736839553644),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.197201947661808),
-                                    ("FridaySeptember", -4.197201947661808),
-                                    ("WednesdayFebruary", -4.197201947661808),
-                                    ("minutemonth", -3.2809112157876537),
-                                    ("SundayMarch", -4.197201947661808),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.197201947661808),
-                                    ("MondayFebruary", -3.791736839553644),
-                                    ("Fridayintersect", -4.197201947661808),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.791736839553644),
-                                    ("dayminute", -2.810907586541918),
-                                    ("SaturdaySeptember", -4.197201947661808),
-                                    ("intersectSeptember", -3.2809112157876537),
-                                    ("MondayMarch", -4.197201947661808),
-                                    ("on <date>September", -3.791736839553644),
-                                    ("intersectintersect", -4.197201947661808),
-                                    ("Tuesdayintersect", -4.197201947661808),
-                                    ("Sundayintersect", -4.197201947661808)],
-                               n = 34}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6286086594223742, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.6026896854443837),
-                                    ("Martin Luther King's Day", -2.6026896854443837),
-                                    ("Memorial Day", -2.6026896854443837),
-                                    ("Mother's Day", -2.6026896854443837),
-                                    ("day", -1.2163953243244932), ("Sunday", -2.6026896854443837),
-                                    ("Thanksgiving Day", -2.6026896854443837),
-                                    ("hour", -2.6026896854443837), ("Tuesday", -2.6026896854443837),
-                                    ("week-end", -2.6026896854443837)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.7621400520468967, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.5257286443082556), ("day", -2.120263536200091),
-                                    ("Sunday", -2.5257286443082556), ("hour", -1.4271163556401458),
-                                    ("week-end", -1.4271163556401458)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time-of-day>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Labor Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -2.3025850929940455),
-                                    ("<time-of-day> am|pm", -1.6094379124341003),
-                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
-                                    ("minute", -1.3862943611198906)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.7227665977411035),
-                                    ("yesterday", -2.2335922215070942),
-                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
-                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
-                               n = 10}}),
-       ("mm.dd.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.70805020110221),
-                                    ("a <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>today", -2.70805020110221),
-                                    ("daysecond", -2.70805020110221),
-                                    ("a <unit-of-duration>right now", -2.70805020110221),
-                                    ("minutenograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("secondnograin", -2.70805020110221),
-                                    ("yearday", -2.0149030205422647),
-                                    ("daynograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>now", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.3978952727983707),
-                                    ("dayday", -1.9924301646902063),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.3978952727983707)],
-                               n = 3}}),
-       ("Independence Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.803360380906535),
-                                    ("Halloween", -2.803360380906535),
-                                    ("Wednesday", -2.803360380906535),
-                                    ("Memorial Day", -2.803360380906535),
-                                    ("Monday", -2.803360380906535),
-                                    ("Mother's Day", -2.803360380906535),
-                                    ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.803360380906535),
-                                    ("March", -2.803360380906535), ("month", -2.803360380906535),
-                                    ("Tuesday", -2.1102132003465894)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> before last|after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -1.8718021769015913),
-                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
-                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by the end of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("this|last|next <cycle>", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hhmm (military) am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.1918471524802814),
-                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
-                                    ("minuteminute", -1.457246097092175),
-                                    ("hh:mmhh:mm", -2.093234863812172),
-                                    ("dayday", -3.1918471524802814),
-                                    ("hourhour", -2.093234863812172),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
-                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.1135153092103742),
-                                    ("daymonth", -2.70805020110221),
-                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
-                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
-                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
-                                    ("minuteminute", -1.8607523407150064),
-                                    ("hourhour", -2.70805020110221),
-                                    ("minutehour", -2.70805020110221),
-                                    ("hh:mmintersect", -2.1972245773362196),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.1135153092103742),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.1135153092103742)],
-                               n = 12}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.252762968495368), ("March", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.8472978603872037),
-                                    ("month", -0.8472978603872037)],
-                               n = 2}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.529395204760564),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -2.4849066497880004),
-                                    ("hourhour", -1.6964492894237302),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
-                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
-                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
-                                    ("hourhour", -2.2129729343043585),
-                                    ("minutehour", -1.2144441041932315),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.4657359027997265),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -2.5494451709255714),
-                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.0602707946915624)],
-                               n = 24}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time-of-day>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 33},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.791759469228055),
-                                    ("daymonth", -1.2809338454620642),
-                                    ("day (grain)intersect", -1.791759469228055),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("week (grain)intersect", -2.1972245773362196),
-                                    ("week (grain)September", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Labor Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0116009116784799),
-                                    ("hh:mmhh:mm", -1.0116009116784799)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.4469189829363254),
-                                    ("minuteminute", -1.4469189829363254),
-                                    ("minutehour", -1.4469189829363254),
-                                    ("hh:mmintersect", -1.4469189829363254)],
-                               n = 6}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -4.0821994520255166e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -3.2188758248682006,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.5257286443082556),
-                                    ("Martin Luther King's Day", -2.5257286443082556),
-                                    ("Monday", -2.5257286443082556), ("day", -1.1394342831883648),
-                                    ("Thanksgiving Day", -2.5257286443082556),
-                                    ("hour", -2.5257286443082556), ("winter", -2.5257286443082556),
-                                    ("week-end", -2.5257286443082556),
-                                    ("summer", -2.120263536200091)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
+      [("Military Spouse Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Bhai Dooj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7537718023763802),
+                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
+                               n = 7}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.824549292051046),
+                                    ("<time-of-day> am|pm", -1.6422277352570913),
+                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
+                                    ("minute", -1.824549292051046)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6239027683849615, unseen = -5.655991810819852,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 284},
+                   koData =
+                     ClassData{prior = -0.7675454706138047,
+                               unseen = -5.5134287461649825,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 246}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -5.406722127027582e-2,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
+                                    ("year", -2.662587827025453),
+                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
+                                    ("a <unit-of-duration>", -2.662587827025453),
+                                    ("month", -2.662587827025453),
+                                    ("fortnight", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -2.9444389791664407,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.5040773967762742),
+                                    ("<integer> <unit-of-duration>", -1.5040773967762742)],
+                               n = 1}}),
+       ("noon|midnight|EOD|end of day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Father's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8109302162163288),
+                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
+                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)December", -2.1400661634962708),
+                                    ("ordinal (digits)February", -2.1400661634962708),
+                                    ("integer (numeric)April", -2.1400661634962708),
+                                    ("month", -1.4469189829363254)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.6741486494265287),
+                                    ("ordinal (digits)July", -2.6741486494265287),
+                                    ("integer (numeric)September", -2.268683541318364),
+                                    ("ordinal (digits)August", -2.6741486494265287),
+                                    ("integer (numeric)August", -2.6741486494265287),
+                                    ("ordinal (digits)April", -2.6741486494265287),
+                                    ("month", -1.0647107369924282),
+                                    ("integer (numeric)July", -2.268683541318364)],
+                               n = 9}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.48863636973214,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("dayhour", -1.4816045409242156),
+                                    ("Mondayearly morning", -3.378724525810097),
+                                    ("time-of-day (latent)tonight", -3.378724525810097),
+                                    ("hourhour", -2.3978952727983707),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("todaypart of days", -3.784189633918261),
+                                    ("minutehour", -2.6855773452501515),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.378724525810097),
+                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
+                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
+                                    ("intersectpart of days", -3.784189633918261),
+                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("tomorrowpart of days", -2.3978952727983707),
+                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("yesterdaypart of days", -3.378724525810097),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("Mondaypart of days", -3.784189633918261)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.772588722239781),
+                                    ("monthhour", -2.772588722239781),
+                                    ("hourhour", -2.772588722239781),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -2.772588722239781),
+                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.772588722239781)],
+                               n = 3}}),
+       ("Cyber Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("today",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mm/dd",
+        Classifier{okData =
+                     ClassData{prior = -1.2729656758128873,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.3285040669720361, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.961215868968717e-2,
+                               unseen = -4.948759890378168,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.8430301339411947),
+                                    ("noon|midnight|EOD|end of day", -3.8430301339411947),
+                                    ("integer after|past <hour-of-day>", -3.8430301339411947),
+                                    ("half after|past <hour-of-day>", -4.248495242049359),
+                                    ("time-of-day (latent)", -1.6835458845878222),
+                                    ("hhmm (latent)", -3.5553480614894135),
+                                    ("<time-of-day> am|pm", -1.8061482066801546),
+                                    ("hh:mm", -3.332204510175204),
+                                    ("about|exactly <time-of-day>", -3.8430301339411947),
+                                    ("hour", -1.0704414117014134),
+                                    ("<time-of-day> sharp|exactly", -4.248495242049359),
+                                    ("minute", -2.05127066471314)],
+                               n = 64},
+                   koData =
+                     ClassData{prior = -2.456735772821304, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.2321436812926323),
+                                    ("hour", -1.2321436812926323)],
+                               n = 6}}),
+       ("December",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -2.1972245773362196),
+                                    ("Wednesday", -2.6026896854443837),
+                                    ("Saturday", -2.6026896854443837),
+                                    ("Monday", -2.1972245773362196),
+                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
+                                    ("Sunday", -2.6026896854443837)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("tonight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the ides of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.4816045409242156),
+                                    ("mm/dd", -3.4965075614664802),
+                                    ("absorption of , after named day", -3.0910424533583156),
+                                    ("intersect", -3.0910424533583156),
+                                    ("Saturday", -2.803360380906535),
+                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
+                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.803360380906535),
+                                    ("hour", -3.4965075614664802)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.791759469228055)],
+                               n = 4}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.11122563511022437,
+                               unseen = -3.970291913552122,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 51},
+                   koData =
+                     ClassData{prior = -2.2512917986064953,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.7884573603642702),
+                                    ("hh:mmhh:mm", -0.7884573603642702)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
+                                    ("minutehour", -0.7884573603642702)],
+                               n = 9}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("October",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from|since|after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.5950491749820006, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July", -3.332204510175204),
+                                    ("time-of-day (latent)", -2.4159137783010487),
+                                    ("<time-of-day> am|pm", -2.4159137783010487),
+                                    ("hh:mm", -2.4159137783010487), ("hour", -1.8281271133989299),
+                                    ("month", -2.9267394020670396), ("minute", -2.4159137783010487),
+                                    ("August", -3.332204510175204)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.22677331936478848,
+                               unseen = -4.9344739331306915,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.828641396489095),
+                                    ("week", -4.23410650459726),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.23410650459726),
+                                    ("today", -4.23410650459726), ("intersect", -2.362304327695668),
+                                    ("second", -4.23410650459726), ("now", -3.5409593240373143),
+                                    ("tomorrow", -3.828641396489095),
+                                    ("this|last|next <cycle>", -4.23410650459726),
+                                    ("day", -1.8827312474337816),
+                                    ("time-of-day (latent)", -4.23410650459726),
+                                    ("<time-of-day> am|pm", -3.828641396489095),
+                                    ("nograin", -3.5409593240373143),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.23410650459726),
+                                    ("Easter Sunday", -4.23410650459726),
+                                    ("Christmas", -3.5409593240373143),
+                                    ("hour", -2.981343536101891), ("month", -4.23410650459726),
+                                    ("<datetime> - <datetime> (interval)", -2.847812143477369),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.5293584123588344),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -3.828641396489095),
+                                    ("minute", -1.749199854809259),
+                                    ("right now", -4.23410650459726),
+                                    ("<month> dd-dd (interval)", -3.5409593240373143),
+                                    ("dd-dd <month> (interval)", -3.828641396489095)],
+                               n = 55}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> more <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.11000089521432846,
+                               unseen = -4.6443908991413725,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.248434627109745),
+                                    ("<integer> more <unit-of-duration>", -3.9415818076696905),
+                                    ("three-quarters of an hour", -3.0252910757955354),
+                                    ("<integer> + '\"", -3.248434627109745),
+                                    ("number.number hours", -3.9415818076696905),
+                                    ("second", -3.536116699561526), ("day", -3.248434627109745),
+                                    ("half an hour", -3.0252910757955354),
+                                    ("year", -3.9415818076696905),
+                                    ("<integer> <unit-of-duration>", -1.5902065505062128),
+                                    ("a <unit-of-duration>", -3.0252910757955354),
+                                    ("quarter of an hour", -3.0252910757955354),
+                                    ("hour", -2.5552874465498),
+                                    ("about|exactly <duration>", -3.9415818076696905),
+                                    ("<integer> and an half hour", -3.9415818076696905),
+                                    ("minute", -1.3025244780544318)],
+                               n = 43},
+                   koData =
+                     ClassData{prior = -2.2617630984737906, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -2.1972245773362196), ("year", -1.9095425048844386),
+                                    ("<integer> <unit-of-duration>", -1.9095425048844386),
+                                    ("a <unit-of-duration>", -2.1972245773362196)],
+                               n = 5}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half <integer> (UK style hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8209805520698302,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayyear", -0.6931471805599453),
+                                    ("Diwali<integer> <unit-of-duration>", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.454305983502537, unseen = -6.732210706467206,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.037870919922137),
+                                    ("Father's Dayyear (latent)", -6.037870919922137),
+                                    ("Ramadanyear (latent)", -6.037870919922137),
+                                    ("<datetime> - <datetime> (interval)on <date>",
+                                     -4.785107951426769),
+                                    ("Military Spouse Dayyear (latent)", -6.037870919922137),
+                                    ("Bhai Doojyear (latent)", -6.037870919922137),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.785107951426769),
+                                    ("hourday", -4.333122827683712),
+                                    ("dayhour", -3.1201001878378585),
+                                    ("Martin Luther King's Dayyear (latent)", -5.632405811813974),
+                                    ("Shemini Atzeretyear (latent)", -6.037870919922137),
+                                    ("daymonth", -5.344723739362192),
+                                    ("monthday", -5.632405811813974),
+                                    ("monthyear", -4.428433007488038),
+                                    ("Yom Ha'atzmautyear (latent)", -6.037870919922137),
+                                    ("Vijayadashamiyear (latent)", -6.037870919922137),
+                                    ("Thanksgiving Dayyear (latent)", -4.939258631254028),
+                                    ("Thai Pongalyear (latent)", -5.344723739362192),
+                                    ("Thiru Onamyear (latent)", -5.344723739362192),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.037870919922137),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -6.037870919922137),
+                                    ("houryear", -5.344723739362192),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.037870919922137),
+                                    ("Christmas<time-of-day> am|pm", -6.037870919922137),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.037870919922137),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.344723739362192),
+                                    ("<time-of-day> am|pmintersect", -4.785107951426769),
+                                    ("Octoberyear (latent)", -4.785107951426769),
+                                    ("intersect<time-of-day> am|pm", -6.037870919922137),
+                                    ("Mattu Pongalyear (latent)", -6.037870919922137),
+                                    ("Shavuotyear (latent)", -6.037870919922137),
+                                    ("Dhanterasin <named-month>|year", -6.037870919922137),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.037870919922137),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.037870919922137),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.632405811813974),
+                                    ("Marchyear (latent)", -6.037870919922137),
+                                    ("Sukkotyear (latent)", -5.632405811813974),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.037870919922137),
+                                    ("Clean Mondayyear (latent)", -5.632405811813974),
+                                    ("monthhour", -5.632405811813974),
+                                    ("todayat <time-of-day>", -6.037870919922137),
+                                    ("Thursday<time> timezone", -4.333122827683712),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.037870919922137),
+                                    ("Palm SundaySunday", -5.632405811813974),
+                                    ("dayday", -3.8406463425859183),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.037870919922137),
+                                    ("mm/ddat <time-of-day>", -6.037870919922137),
+                                    ("tonightat <time-of-day>", -6.037870919922137),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.344723739362192),
+                                    ("today<time-of-day> am|pm", -6.037870919922137),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.632405811813974),
+                                    ("at <time-of-day><time> <part-of-day>", -6.037870919922137),
+                                    ("mm/dd<time-of-day> am|pm", -6.037870919922137),
+                                    ("hourhour", -4.785107951426769),
+                                    ("<time-of-day> am|pmon <date>", -4.022967899379873),
+                                    ("Wednesdaythis|last|next <cycle>", -6.037870919922137),
+                                    ("Lentyear (latent)", -6.037870919922137),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.533793523145864),
+                                    ("Boghiyear (latent)", -6.037870919922137),
+                                    ("dayyear", -1.9688441656843267),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.037870919922137),
+                                    ("Thursdayat <time-of-day>", -5.632405811813974),
+                                    ("Islamic New Yearyear (latent)", -5.632405811813974),
+                                    ("Laylat al-Qadryear (latent)", -5.121580188047982),
+                                    ("Chhathin <named-month>|year", -6.037870919922137),
+                                    ("Vasant Panchamiin <named-month>|year", -6.037870919922137),
+                                    ("Diwaliin <named-month>|year", -6.037870919922137),
+                                    ("Shrove Tuesdayyear (latent)", -6.037870919922137),
+                                    ("<time-of-day> am|pmtomorrow", -5.344723739362192),
+                                    ("Yom Kippuryear (latent)", -6.037870919922137),
+                                    ("<part-of-day> of <time>year (latent)", -6.037870919922137),
+                                    ("minutehour", -5.121580188047982),
+                                    ("Kaanum Pongalyear (latent)", -5.632405811813974),
+                                    ("Maha Saptamiyear (latent)", -6.037870919922137),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.632405811813974),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.333122827683712),
+                                    ("for <duration> from <time>December", -6.037870919922137),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.037870919922137),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.121580188047982),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.632405811813974),
+                                    ("Pentecostyear (latent)", -6.037870919922137),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.121580188047982),
+                                    ("Eid al-Fitryear (latent)", -6.037870919922137),
+                                    ("Mondayin|during the <part-of-day>", -6.037870919922137),
+                                    ("Raksha Bandhanyear (latent)", -6.037870919922137),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.632405811813974),
+                                    ("Navaratriin <named-month>|year", -6.037870919922137),
+                                    ("Ashurayear (latent)", -6.037870919922137),
+                                    ("Chinese New Yearyear (latent)", -6.037870919922137),
+                                    ("Sundayyear (latent)", -6.037870919922137),
+                                    ("Lag BaOmeryear (latent)", -6.037870919922137),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.037870919922137),
+                                    ("Eid al-Adhayear (latent)", -5.121580188047982),
+                                    ("intersectin|during the <part-of-day>", -6.037870919922137),
+                                    ("Christmasat <time-of-day>", -6.037870919922137),
+                                    ("Passoveryear (latent)", -6.037870919922137),
+                                    ("Lazarus Saturdayyear (latent)", -6.037870919922137),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.037870919922137),
+                                    ("Cyber Mondayyear (latent)", -5.632405811813974),
+                                    ("Yom HaShoahyear (latent)", -5.632405811813974),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -5.121580188047982),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.037870919922137),
+                                    ("Thai Pongalin <named-month>|year", -6.037870919922137),
+                                    ("Septemberyear (latent)", -5.632405811813974),
+                                    ("mm/ddyear (latent)", -6.037870919922137),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -4.785107951426769),
+                                    ("Halloweenyear (latent)", -6.037870919922137),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.344723739362192),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -5.121580188047982),
+                                    ("at <time-of-day>intersect", -5.632405811813974),
+                                    ("Rosh Hashanahyear (latent)", -6.037870919922137),
+                                    ("Dhanterasyear (latent)", -6.037870919922137),
+                                    ("Tu BiShvatyear (latent)", -6.037870919922137),
+                                    ("Holiyear (latent)", -5.344723739362192),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.037870919922137),
+                                    ("Holika Dahanyear (latent)", -5.344723739362192),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.037870919922137),
+                                    ("dayminute", -3.398813590306879),
+                                    ("Mawlidyear (latent)", -6.037870919922137),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.632405811813974),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.037870919922137),
+                                    ("Jumu'atul-Widayear (latent)", -5.121580188047982),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.037870919922137),
+                                    ("minuteday", -2.400284760195752),
+                                    ("absorption of , after named dayintersect",
+                                     -6.037870919922137),
+                                    ("intersectyear (latent)", -6.037870919922137),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.037870919922137),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.037870919922137),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.037870919922137),
+                                    ("Boss's Dayyear (latent)", -5.632405811813974),
+                                    ("Tisha B'Avyear (latent)", -6.037870919922137),
+                                    ("Isra and Mi'rajyear (latent)", -5.121580188047982),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.037870919922137),
+                                    ("Christmasyear (latent)", -5.632405811813974),
+                                    ("Naraka Chaturdashiyear (latent)", -5.632405811813974),
+                                    ("at <time-of-day>on <date>", -4.939258631254028),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.428433007488038),
+                                    ("dayweek", -6.037870919922137),
+                                    ("Easter Sundayyear (latent)", -5.344723739362192),
+                                    ("Thursday<time-of-day> am|pm", -6.037870919922137),
+                                    ("weekyear", -5.632405811813974),
+                                    ("hh:mmin|during the <part-of-day>", -5.344723739362192),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.632405811813974),
+                                    ("Hanukkahyear (latent)", -6.037870919922137),
+                                    ("February<time> <part-of-day>", -6.037870919922137),
+                                    ("National Grandparents Dayyear (latent)", -6.037870919922137),
+                                    ("Tuesdayin <named-month>|year", -6.037870919922137),
+                                    ("Great Lentyear (latent)", -6.037870919922137),
+                                    ("tomorrowat <time-of-day>", -5.344723739362192),
+                                    ("Labor Dayyear (latent)", -6.037870919922137),
+                                    ("between <time> and <time>on <date>", -4.428433007488038),
+                                    ("Thursdayfrom|since|after <time-of-day>", -5.344723739362192),
+                                    ("last <cycle> of <time>year (latent)", -5.344723739362192),
+                                    ("at <time-of-day>tomorrow", -5.632405811813974),
+                                    ("tomorrow<time-of-day> am|pm", -6.037870919922137),
+                                    ("President's Dayyear (latent)", -6.037870919922137),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.037870919922137),
+                                    ("Diwaliyear (latent)", -6.037870919922137),
+                                    ("Black Fridayyear (latent)", -5.632405811813974),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.037870919922137),
+                                    ("Chhathyear (latent)", -5.632405811813974),
+                                    ("Vasant Panchamiyear (latent)", -6.037870919922137),
+                                    ("Palm Sundayintersect", -6.037870919922137),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.037870919922137),
+                                    ("Februaryintersect", -6.037870919922137),
+                                    ("Mother's Dayyear (latent)", -6.037870919922137),
+                                    ("Simchat Torahyear (latent)", -6.037870919922137)],
+                               n = 313},
+                   koData =
+                     ClassData{prior = -1.0075523231524797, unseen = -6.35088571671474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.655991810819852),
+                                    ("hourday", -5.655991810819852),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.655991810819852),
+                                    ("dayhour", -3.213644775450648),
+                                    ("daymonth", -3.5765502691400166),
+                                    ("monthday", -5.250526702711688),
+                                    ("monthyear", -4.403228842324484),
+                                    ("<time-of-day> am|pmyear (latent)", -5.250526702711688),
+                                    ("Thai Pongalyear (latent)", -4.962844630259907),
+                                    ("intersecthh:mm", -5.655991810819852),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.655991810819852),
+                                    ("houryear", -4.739701078945697),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.655991810819852),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.655991810819852),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.962844630259907),
+                                    ("<time-of-day> am|pmintersect", -4.403228842324484),
+                                    ("Octoberyear (latent)", -5.655991810819852),
+                                    ("from|since|after <time-of-day>year (latent)",
+                                     -4.403228842324484),
+                                    ("from|since|after <time-of-day>on <date>", -4.739701078945697),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.655991810819852),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.403228842324484),
+                                    ("about|exactly <time-of-day>year (latent)",
+                                     -5.655991810819852),
+                                    ("absorption of , after named dayJuly", -5.250526702711688),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.739701078945697),
+                                    ("Clean Mondayyear (latent)", -5.655991810819852),
+                                    ("monthhour", -5.655991810819852),
+                                    ("hourmonth", -4.962844630259907),
+                                    ("todayat <time-of-day>", -5.655991810819852),
+                                    ("from|since|after <time-of-day>July", -5.655991810819852),
+                                    ("Mondayyear (latent)", -4.557379522151743),
+                                    ("dayday", -5.250526702711688),
+                                    ("mm/ddat <time-of-day>", -5.250526702711688),
+                                    ("<time-of-day> am|pmon <date>", -4.403228842324484),
+                                    ("dayyear", -2.6355669246754903),
+                                    ("Thursdaymm/dd", -5.655991810819852),
+                                    ("New Year's Dayyear (latent)", -5.250526702711688),
+                                    ("Thursdayat <time-of-day>", -4.403228842324484),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.655991810819852),
+                                    ("Aprilyear (latent)", -5.655991810819852),
+                                    ("monthminute", -5.655991810819852),
+                                    ("<time-of-day> am|pmtomorrow", -5.655991810819852),
+                                    ("Thursdayhh:mm", -4.739701078945697),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.655991810819852),
+                                    ("minutemonth", -3.8642323415917974),
+                                    ("Sundayfrom|since|after <time-of-day>", -5.655991810819852),
+                                    ("week-endin <named-month>|year", -5.655991810819852),
+                                    ("Augustyear (latent)", -5.250526702711688),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.250526702711688),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.250526702711688),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.250526702711688),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.655991810819852),
+                                    ("Sundayyear (latent)", -4.962844630259907),
+                                    ("Christmasat <time-of-day>", -5.655991810819852),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.655991810819852),
+                                    ("yesterday<time-of-day> am|pm", -5.655991810819852),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.739701078945697),
+                                    ("mm/ddyear (latent)", -5.655991810819852),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.250526702711688),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.655991810819852),
+                                    ("until <time-of-day>on <date>", -4.962844630259907),
+                                    ("at <time-of-day>intersect", -5.250526702711688),
+                                    ("hh:mmyear (latent)", -4.557379522151743),
+                                    ("Holiyear (latent)", -5.655991810819852),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.655991810819852),
+                                    ("dayminute", -3.1710851610318525),
+                                    ("intersectSeptember", -4.151914414043579),
+                                    ("minuteday", -2.5879388756862354),
+                                    ("absorption of , after named dayintersect",
+                                     -5.655991810819852),
+                                    ("Februaryin|during the <part-of-day>", -5.655991810819852),
+                                    ("hh:mmon <date>", -3.6410887902775877),
+                                    ("Saturdayyear (latent)", -5.655991810819852),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -5.655991810819852),
+                                    ("absorption of , after named daySeptember",
+                                     -4.739701078945697),
+                                    ("Naraka Chaturdashiyear (latent)", -5.655991810819852),
+                                    ("on <date>September", -5.250526702711688),
+                                    ("at <time-of-day>on <date>", -5.250526702711688),
+                                    ("in <named-month>|yearyear (latent)", -5.655991810819852),
+                                    ("dayweek", -5.655991810819852),
+                                    ("Easter Sundayyear (latent)", -5.250526702711688),
+                                    ("Thursday<time-of-day> am|pm", -5.250526702711688),
+                                    ("absorption of , after named dayFebruary", -4.739701078945697),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.655991810819852),
+                                    ("tomorrowat <time-of-day>", -5.655991810819852),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.655991810819852),
+                                    ("Thursdayfrom|since|after <time-of-day>", -4.046553898385752),
+                                    ("tomorrow<time-of-day> am|pm", -5.655991810819852),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -4.962844630259907),
+                                    ("Diwaliyear (latent)", -5.250526702711688),
+                                    ("Tuesdayfrom|since|after <time-of-day>", -5.655991810819852),
+                                    ("Fridayyear (latent)", -5.250526702711688),
+                                    ("minuteyear", -4.403228842324484)],
+                               n = 180}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.2039728043259361,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.35667494393873245,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.19105523676270922),
+                                    ("integer (0..19)", -1.749199854809259)],
+                               n = 21}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 27},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.001480000210124),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("hh:mmhh:mm", -2.001480000210124),
+                                    ("dayday", -2.512305623976115),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
+                                    ("hourhour", -2.512305623976115),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.1986731175506815),
+                                    ("dayhour", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.1986731175506815),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -3.1986731175506815),
+                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
+                                    ("minuteminute", -2.793208009442517),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.793208009442517),
+                                    ("dayday", -3.1986731175506815),
+                                    ("hourhour", -2.505525936990736),
+                                    ("dayyear", -3.1986731175506815),
+                                    ("minutehour", -2.2823823856765264),
+                                    ("hh:mmintersect", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -3.1986731175506815)],
+                               n = 14}}),
+       ("Saturday",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekmonth", -1.7346010553881064),
+                                    ("week (grain)October", -1.7346010553881064),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekday", -1.2237754316221157)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6094379124341003),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("hourminute", -2.3025850929940455),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.70805020110221),
+                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.0149030205422647),
+                                    ("hourhour", -1.791759469228055),
+                                    ("minutehour", -1.6094379124341003),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
+                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
+                               n = 4}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.15524059819128397,
+                               unseen = -4.912654885736052,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.546237407675729e-2),
+                                    ("intersect 2 numbers", -3.518980417318539)],
+                               n = 131},
+                   koData =
+                     ClassData{prior = -1.9393954680341197, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3121863889661687),
+                                    ("negative numbers", -0.6190392084062235),
+                                    ("compose by multiplication", -1.8718021769015913)],
+                               n = 22}}),
+       ("mm/dd/yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Memorial Day",
+        Classifier{okData =
+                     ClassData{prior = -0.1823215567939546,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -1.791759469228055, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Monday",
+        Classifier{okData =
+                     ClassData{prior = -0.5108256237659907, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -0.916290731874155, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lincoln's Birthday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm:ss",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Hanukkah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262),
+                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>integer (numeric)",
+                                     -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9808292530117262),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.0794415416798357),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -1.6739764335716716),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.3862943611198906)],
+                               n = 3}}),
+       ("National Grandparents Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Valentine's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.0821994520255166e-2,
+                               unseen = -4.304065093204169,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 72},
+                   koData =
+                     ClassData{prior = -3.2188758248682006,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.3513752571634776),
+                                    ("part of daysintersect", -2.3513752571634776),
+                                    ("hourday", -0.9650808960435872),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.3513752571634776),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.3513752571634776),
+                                    ("part of daysthis <time>", -2.3513752571634776),
+                                    ("part of daysChristmas", -1.9459101490553135)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.252762968495368),
+                                    ("one twenty two", -0.8472978603872037),
+                                    ("one eleven", -1.252762968495368)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Loyalty Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.3513752571634776),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.3513752571634776),
+                                    ("ordinal (digits)February", -2.3513752571634776),
+                                    ("integer (numeric)February", -1.9459101490553135),
+                                    ("month", -0.9650808960435872),
+                                    ("ordinal (digits)March", -2.3513752571634776),
+                                    ("integer (numeric)July", -2.3513752571634776)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.5040773967762742),
+                                    ("month", -1.5040773967762742)],
+                               n = 1}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3677247801253174,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.5257286443082556),
+                                    ("hour", -0.7339691750802004),
+                                    ("part of days", -0.8209805520698302)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Groundhog Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -7.410797215372185e-2,
+                               unseen = -5.117993812416755,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1416958748044215),
+                                    ("month (grain)", -2.8094026953624978),
+                                    ("year (grain)", -2.472930458741285),
+                                    ("week (grain)", -1.1416958748044215),
+                                    ("quarter", -3.5025498759224427), ("year", -2.472930458741285),
+                                    ("month", -2.8094026953624978),
+                                    ("quarter (grain)", -3.5025498759224427)],
+                               n = 78},
+                   koData =
+                     ClassData{prior = -2.639057329615259, unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.4816045409242156),
+                                    ("week (grain)", -1.4816045409242156),
+                                    ("day", -1.9924301646902063),
+                                    ("day (grain)", -1.9924301646902063)],
+                               n = 6}}),
+       ("Mother's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.7047480922384253),
+                                    ("ordinal (digits)", -0.2006706954621511)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("ordinal (digits)", -0.2876820724517809)],
+                               n = 2}}),
+       ("last weekend of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
+                                    ("month", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (number)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.262364264467491, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -1.466337068793427, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Chinese New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.5699145401359973, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.11778303565638351),
+                                    ("integer (0..19)", -2.330755969960742)],
+                               n = 69},
+                   koData =
+                     ClassData{prior = -0.8337291311811348, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.352605801082348e-2),
+                                    ("integer (0..19)", -2.9267394020670396),
+                                    ("integer 21..99", -3.332204510175204)],
+                               n = 53}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -1.6094379124341003),
+                                    ("MondayMarch", -1.6094379124341003),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.13858616328614667,
+                               unseen = -5.147494476813453,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5026062268874014),
+                                    ("integer (0..19)year (grain)", -3.062222014822824),
+                                    ("integer (numeric)day (grain)", -2.743768283704289),
+                                    ("integer (0..19)second (grain) ", -3.7553691953827695),
+                                    ("integer (0..19)hour (grain)", -3.062222014822824),
+                                    ("second", -3.349904087274605),
+                                    ("integer (numeric)second (grain) ", -4.04305126783455),
+                                    ("integer (numeric)year (grain)", -3.349904087274605),
+                                    ("day", -2.4336133554004498), ("year", -2.576714199041123),
+                                    ("integer (numeric)week (grain)", -3.062222014822824),
+                                    ("integer (0..19)month (grain)", -3.5322256440685593),
+                                    ("hour", -2.6567569067146595), ("month", -3.1957534074473464),
+                                    ("integer (numeric)minute (grain)", -3.1957534074473464),
+                                    ("integer (0..19)minute (grain)", -3.062222014822824),
+                                    ("integer (numeric)month (grain)", -4.04305126783455),
+                                    ("minute", -2.5026062268874014),
+                                    ("integer (numeric)hour (grain)", -3.5322256440685593),
+                                    ("integer (0..19)day (grain)", -3.5322256440685593),
+                                    ("integer (0..19)week (grain)", -3.1957534074473464)],
+                               n = 74},
+                   koData =
+                     ClassData{prior = -2.044755983691946, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
+                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
+                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
+                               n = 11}}),
+       ("hhmm (latent)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -5.342334251964811,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.951243718581427),
+                                    ("at <time-of-day>", -2.202043863772168),
+                                    ("from|since|after <time-of-day>", -3.7281001672672174),
+                                    ("<time-of-day> o'clock", -4.238925791033208),
+                                    ("half after|past <hour-of-day>", -4.238925791033208),
+                                    ("time-of-day (latent)", -1.7266201670570935),
+                                    ("hhmm (latent)", -4.6443908991413725),
+                                    ("hh:mm", -2.293015641977895),
+                                    ("quarter after|past <hour-of-day>", -4.6443908991413725),
+                                    ("about|exactly <time-of-day>", -4.6443908991413725),
+                                    ("until <time-of-day>", -3.951243718581427),
+                                    ("hour", -1.2104036946562264),
+                                    ("<time-of-day> sharp|exactly", -4.6443908991413725),
+                                    ("minute", -1.754019141245208)],
+                               n = 96},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -4.394449154672439,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
+                                    ("from|since|after <time-of-day>", -3.283414346005772),
+                                    ("<hour-of-day> <integer>", -3.6888794541139363),
+                                    ("time-of-day (latent)", -1.0498221244986778),
+                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
+                               n = 32}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
+                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
+                                    ("month", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thanksgiving Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.5306282510621704,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1400661634962708),
+                                    ("year (grain)", -2.4277482359480516),
+                                    ("second", -2.833213344056216),
+                                    ("week (grain)", -2.1400661634962708),
+                                    ("day", -2.1400661634962708),
+                                    ("minute (grain)", -2.833213344056216),
+                                    ("year", -2.4277482359480516),
+                                    ("second (grain) ", -2.833213344056216),
+                                    ("minute", -2.833213344056216),
+                                    ("day (grain)", -2.1400661634962708)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -0.8873031950009028, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -1.7227665977411035),
+                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
+                                    ("quarter (grain)", -1.9459101490553135)],
+                               n = 7}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -0.6931471805599453),
+                                    ("year", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -5.6352936551131744e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
+                   koData =
+                     ClassData{prior = -2.9041650800285006, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Rosh Hashanah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("monthyear", -1.2992829841302609),
+                                    ("Marcha <unit-of-duration>", -1.7047480922384253),
+                                    ("March<integer> <unit-of-duration>", -1.7047480922384253),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -1.7047480922384253),
+                                    ("dayyear", -1.7047480922384253)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.45547552868282576,
+                               unseen = -5.117993812416755,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.418840607796598),
+                                    ("dayhour", -3.16607763930123), ("daymonth", -3.16607763930123),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.418840607796598),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.7256934272366524),
+                                    ("Wednesdayintersect", -4.418840607796598),
+                                    ("Labor Daythis|last|next <cycle>", -4.418840607796598),
+                                    ("Black Fridaythis|last|next <cycle>", -4.418840607796598),
+                                    ("<part-of-day> of <time>February", -4.418840607796598),
+                                    ("Saturday<time-of-day> am|pm", -4.418840607796598),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -4.013375499688434),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.418840607796598),
+                                    ("on <date><time-of-day> am|pm", -4.418840607796598),
+                                    ("hourmonth", -4.418840607796598),
+                                    ("dayday", -2.5470384308950065),
+                                    ("the <day-of-month> (ordinal)February", -4.013375499688434),
+                                    ("WednesdayOctober", -4.418840607796598),
+                                    ("Wednesdaythis|last|next <cycle>", -4.013375499688434),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.5025498759224427),
+                                    ("dayyear", -2.7140925155581725),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.418840607796598),
+                                    ("Thursdayhh:mm", -4.013375499688434),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.418840607796598),
+                                    ("Memorial Daythis|last|next <cycle>", -4.418840607796598),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -4.013375499688434),
+                                    ("TuesdayOctober", -4.418840607796598),
+                                    ("the <day-of-month> (ordinal)March", -4.418840607796598),
+                                    ("Mondaythis|last|next <cycle>", -4.418840607796598),
+                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.418840607796598),
+                                    ("Fridayintersect", -4.418840607796598),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -3.7256934272366524),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.5025498759224427),
+                                    ("Tuesdaythis|last|next <cycle>", -4.418840607796598),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.418840607796598),
+                                    ("dayminute", -3.0325462466767075),
+                                    ("minuteday", -3.5025498759224427),
+                                    ("this|last|next <cycle>Sunday", -4.418840607796598),
+                                    ("intersectyear (latent)", -4.418840607796598),
+                                    ("Sundaythis|last|next <cycle>", -4.418840607796598),
+                                    ("weekday", -4.418840607796598),
+                                    ("dayweek", -3.3202283191284883),
+                                    ("Thursday<time-of-day> am|pm", -4.418840607796598),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -4.013375499688434),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -4.013375499688434)],
+                               n = 52},
+                   koData =
+                     ClassData{prior = -1.0055218656020977, unseen = -4.812184355372417,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.110873864173311),
+                                    ("week-endOctober", -3.417726683613366),
+                                    ("daymonth", -1.9136492868370918),
+                                    ("TuesdaySeptember", -4.110873864173311),
+                                    ("Wednesdayintersect", -4.110873864173311),
+                                    ("hourmonth", -3.012261575505202),
+                                    ("Fridaythis|last|next <cycle>", -4.110873864173311),
+                                    ("SundayFebruary", -4.110873864173311),
+                                    ("WednesdayOctober", -4.110873864173311),
+                                    ("week-endintersect", -4.110873864173311),
+                                    ("dayyear", -4.110873864173311),
+                                    ("FridayJuly", -3.7054087560651467),
+                                    ("FridaySeptember", -4.110873864173311),
+                                    ("WednesdayFebruary", -4.110873864173311),
+                                    ("minutemonth", -3.1945831322991562),
+                                    ("SundayMarch", -4.110873864173311),
+                                    ("MondayFebruary", -3.7054087560651467),
+                                    ("Fridayintersect", -4.110873864173311),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.7054087560651467),
+                                    ("dayminute", -3.417726683613366),
+                                    ("SaturdaySeptember", -4.110873864173311),
+                                    ("intersectSeptember", -3.1945831322991562),
+                                    ("MondayMarch", -4.110873864173311),
+                                    ("on <date>September", -3.7054087560651467),
+                                    ("Tuesdayintersect", -4.110873864173311),
+                                    ("Sundayintersect", -4.110873864173311)],
+                               n = 30}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.4595323293784402,
+                               unseen = -3.6635616461296463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Father's Day", -2.9444389791664407),
+                                    ("Martin Luther King's Day", -2.9444389791664407),
+                                    ("Cyber Monday", -2.9444389791664407),
+                                    ("Memorial Day", -2.9444389791664407),
+                                    ("Mother's Day", -2.9444389791664407),
+                                    ("day", -1.1526795099383855), ("Sunday", -2.9444389791664407),
+                                    ("Chinese New Year", -2.538973871058276),
+                                    ("Thanksgiving Day", -2.9444389791664407),
+                                    ("Easter Sunday", -2.9444389791664407),
+                                    ("hour", -2.9444389791664407), ("Tuesday", -2.9444389791664407),
+                                    ("week-end", -2.9444389791664407)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -0.9985288301111273, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.639057329615259), ("day", -2.2335922215070942),
+                                    ("Sunday", -2.639057329615259), ("hour", -1.540445040947149),
+                                    ("week-end", -1.540445040947149)],
+                               n = 7}}),
+       ("March",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.120263536200091),
+                                    ("Thursdayordinal (digits)", -2.5257286443082556),
+                                    ("day", -2.120263536200091),
+                                    ("Augustordinal (digits)", -2.5257286443082556),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.120263536200091),
+                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
+                                    ("month", -1.2729656758128873),
+                                    ("Marchordinal (digits)", -2.5257286443082556)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time-of-day>ordinal (digits)",
+                                     -1.8718021769015913),
+                                    ("Augustordinal (digits)", -1.8718021769015913),
+                                    ("month", -1.466337068793427)],
+                               n = 2}}),
+       ("Labor Day weekend",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Veterans Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -2.3025850929940455),
+                                    ("<time-of-day> am|pm", -1.6094379124341003),
+                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
+                                    ("minute", -1.3862943611198906)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7227665977411035),
+                                    ("yesterday", -2.2335922215070942),
+                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
+                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
+                               n = 10}}),
+       ("mm.dd.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.3184537311185346,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -2.803360380906535),
+                                    ("a <unit-of-duration>Christmas", -2.803360380906535),
+                                    ("dayday", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>today", -2.803360380906535),
+                                    ("daysecond", -2.803360380906535),
+                                    ("a <unit-of-duration>right now", -2.803360380906535),
+                                    ("minutenograin", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>Christmas", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -2.803360380906535),
+                                    ("secondnograin", -2.803360380906535),
+                                    ("yearday", -2.1102132003465894),
+                                    ("daynograin", -2.803360380906535),
+                                    ("<integer> <unit-of-duration>now", -2.3978952727983707)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.2992829841302609,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.4423470353692043),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.4423470353692043),
+                                    ("dayday", -2.03688192726104),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.4423470353692043),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.4423470353692043)],
+                               n = 3}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.803360380906535),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.803360380906535),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
+                                    ("integer (numeric)this|last|next <cycle>",
+                                     -2.3978952727983707),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("integer (numeric)February", -2.3978952727983707),
+                                    ("month", -0.9315582040049435),
+                                    ("ordinal (digits)March", -2.803360380906535),
+                                    ("integer (numeric)July", -2.803360380906535)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.7047480922384253),
+                                    ("month", -1.7047480922384253)],
+                               n = 1}}),
+       ("Independence Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.890371757896165),
+                                    ("Halloween", -2.890371757896165),
+                                    ("Wednesday", -2.890371757896165),
+                                    ("Boss's Day", -2.890371757896165),
+                                    ("Memorial Day", -2.890371757896165),
+                                    ("Monday", -2.890371757896165),
+                                    ("Mother's Day", -2.890371757896165),
+                                    ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -2.890371757896165),
+                                    ("March", -2.890371757896165), ("month", -2.890371757896165),
+                                    ("Tuesday", -2.1972245773362196)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> sharp|exactly",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.1400661634962708),
+                                    ("time-of-day (latent)", -2.1400661634962708),
+                                    ("hhmm (latent)", -2.1400661634962708),
+                                    ("<time-of-day> am|pm", -2.1400661634962708),
+                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
+                                    ("minute", -1.4469189829363254)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -2.4423470353692043),
+                                    ("year (latent)", -1.0560526742493137),
+                                    ("year", -1.0560526742493137), ("March", -2.4423470353692043),
+                                    ("month", -2.03688192726104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.2992829841302609),
+                                    ("year (latent)", -1.7047480922384253),
+                                    ("year", -1.7047480922384253), ("month", -1.2992829841302609)],
+                               n = 3}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -7.696104113612832e-2),
+                                    ("integer (0..19)", -2.6026896854443837)],
+                               n = 25}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> before last|after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
+                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by the end of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hhmm (military) am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.1918471524802814),
+                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
+                                    ("minuteminute", -1.457246097092175),
+                                    ("hh:mmhh:mm", -2.093234863812172),
+                                    ("dayday", -3.1918471524802814),
+                                    ("hourhour", -2.093234863812172),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
+                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -3.1135153092103742),
+                                    ("daymonth", -2.70805020110221),
+                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
+                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
+                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
+                                    ("minuteminute", -1.8607523407150064),
+                                    ("hourhour", -2.70805020110221),
+                                    ("minutehour", -2.70805020110221),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -3.1135153092103742),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.1135153092103742)],
+                               n = 12}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Day",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Memorial Day weekend",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.529395204760564),
+                                    ("hh:mmhh:mm", -1.8971199848858813),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.4849066497880004),
+                                    ("hourhour", -1.6964492894237302),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -3.4011973816621555),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.4011973816621555),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
+                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
+                                    ("hourhour", -2.2129729343043585),
+                                    ("minutehour", -1.2144441041932315),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.4657359027997265),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -2.5494451709255714),
+                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.0602707946915624)],
+                               n = 24}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.42121346507630353,
+                               unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5455312716044354),
+                                    ("Marchinteger (numeric)", -2.833213344056216),
+                                    ("Aprilinteger (numeric)", -3.2386784521643803),
+                                    ("month", -0.8407831793660099),
+                                    ("Februaryinteger (numeric)", -1.9859154836690123),
+                                    ("Septemberinteger (numeric)", -2.833213344056216),
+                                    ("Octoberinteger (numeric)", -2.833213344056216),
+                                    ("Julyinteger (numeric)", -2.1400661634962708)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time-of-day>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("President's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.2512917986064953),
+                                    ("Wednesday", -2.2512917986064953),
+                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
+                                    ("Tuesday", -1.55814461804655)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.791759469228055),
+                                    ("daymonth", -1.2809338454620642),
+                                    ("day (grain)intersect", -1.791759469228055),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("week (grain)intersect", -2.1972245773362196),
+                                    ("week (grain)September", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Labor Day",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.5040773967762742,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.25131442828090605,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("right now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("for <duration> from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -1.5040773967762742),
+                                    ("dayday", -1.0986122886681098),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.252762968495368)],
+                               n = 1}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.832909122935104),
+                                    ("hh:mmhh:mm", -0.832909122935104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
+                                    ("minuteminute", -1.410986973710262),
+                                    ("minutehour", -1.410986973710262),
+                                    ("hh:mmintersect", -1.410986973710262)],
+                               n = 18}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -3.509131981127006e-2,
+                               unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
+                   koData =
+                     ClassData{prior = -3.367295829986474, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.791759469228055),
+                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.1972245773362196),
+                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
+                                    ("month", -0.9444616088408514),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("August",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/EN_XX.hs b/Duckling/Ranking/Classifiers/EN_XX.hs
--- a/Duckling/Ranking/Classifiers/EN_XX.hs
+++ b/Duckling/Ranking/Classifiers/EN_XX.hs
@@ -21,2389 +21,3001 @@
 classifiers :: Classifiers
 classifiers
   = HashMap.fromList
-      [("<integer> to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)noon|midnight|EOD|end of day",
-                                     -0.916290731874155),
-                                    ("hour", -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.7537718023763802),
-                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
-                               n = 7}}),
-       ("<time> timezone",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -1.824549292051046),
-                                    ("<time-of-day> am|pm", -1.6422277352570913),
-                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
-                                    ("minute", -1.824549292051046)],
-                               n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thursday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (numeric)",
-        Classifier{okData =
-                     ClassData{prior = -0.7765287894989963, unseen = -5.225746673713201,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 184},
-                   koData =
-                     ClassData{prior = -0.616186139423817, unseen = -5.384495062789089,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 216}}),
-       ("<duration> hence|ago",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.784189633918261,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
-                                    ("year", -2.662587827025453),
-                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
-                                    ("a <unit-of-duration>", -2.662587827025453),
-                                    ("month", -2.662587827025453),
-                                    ("fortnight", -2.662587827025453)],
-                               n = 18},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("noon|midnight|EOD|end of day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter to|till|before <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.5596157879354228, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.6094379124341003),
-                                    ("dayday", -1.0986122886681098),
-                                    ("day (grain)yesterday", -1.6094379124341003)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -0.8472978603872037, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.466337068793427),
-                                    ("year (grain)Christmas", -1.8718021769015913),
-                                    ("day (grain)intersect", -1.466337068793427),
-                                    ("yearday", -1.8718021769015913)],
-                               n = 3}}),
-       ("Martin Luther King's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("integer (20..90)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("mm/yyyy",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("integer after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.8109302162163288),
-                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
-                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal or number) <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)December", -2.1400661634962708),
-                                    ("ordinal (digits)February", -2.1400661634962708),
-                                    ("integer (numeric)April", -2.1400661634962708),
-                                    ("month", -1.4469189829363254)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -3.4011973816621555,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)October", -2.6741486494265287),
-                                    ("ordinal (digits)July", -2.6741486494265287),
-                                    ("integer (numeric)September", -2.268683541318364),
-                                    ("ordinal (digits)August", -2.6741486494265287),
-                                    ("integer (numeric)August", -2.6741486494265287),
-                                    ("ordinal (digits)April", -2.6741486494265287),
-                                    ("month", -1.0647107369924282),
-                                    ("integer (numeric)July", -2.268683541318364)],
-                               n = 9}}),
-       ("<time> <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.844007281325252e-2,
-                               unseen = -4.430816798843313,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("dayhour", -1.5284688499004333),
-                                    ("Mondayearly morning", -3.3202283191284883),
-                                    ("time-of-day (latent)tonight", -3.3202283191284883),
-                                    ("hourhour", -2.339399066116762),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("todaypart of days", -3.7256934272366524),
-                                    ("minutehour", -2.627081138568543),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -3.3202283191284883),
-                                    ("time-of-day (latent)this <part-of-day>", -3.7256934272366524),
-                                    ("Mondayin|during the <part-of-day>", -3.7256934272366524),
-                                    ("intersectpart of days", -3.7256934272366524),
-                                    ("intersectin|during the <part-of-day>", -3.7256934272366524),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("tomorrowpart of days", -2.339399066116762),
-                                    ("hh:mmin|during the <part-of-day>", -3.0325462466767075),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("hhmm (latent)in|during the <part-of-day>",
-                                     -3.7256934272366524),
-                                    ("yesterdaypart of days", -3.7256934272366524),
-                                    ("Mondaypart of days", -3.7256934272366524)],
-                               n = 29},
-                   koData =
-                     ClassData{prior = -2.367123614131617, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("yearhour", -2.740840023925201),
-                                    ("monthhour", -2.740840023925201),
-                                    ("hourhour", -2.740840023925201),
-                                    ("past year (latent)in|during the <part-of-day>",
-                                     -2.740840023925201),
-                                    ("Februaryin|during the <part-of-day>", -2.740840023925201),
-                                    ("time-of-day (latent)in|during the <part-of-day>",
-                                     -2.740840023925201)],
-                               n = 3}}),
-       ("today",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd",
-        Classifier{okData =
-                     ClassData{prior = -1.4271163556401458,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -0.2744368457017603, unseen = -3.044522437723423,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 19}}),
-       ("at <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -9.381875521765486e-2,
-                               unseen = -4.90527477843843,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<time> timezone", -3.7992275112828016),
-                                    ("noon|midnight|EOD|end of day", -3.7992275112828016),
-                                    ("integer after|past <hour-of-day>", -3.7992275112828016),
-                                    ("half after|past <hour-of-day>", -4.204692619390966),
-                                    ("time-of-day (latent)", -1.7197859696029658),
-                                    ("hhmm (latent)", -3.5115454388310208),
-                                    ("<time-of-day> am|pm", -1.8067973465925955),
-                                    ("hh:mm", -3.288401887516811),
-                                    ("about|exactly <time-of-day>", -3.7992275112828016),
-                                    ("hour", -1.0911773101805915),
-                                    ("<time-of-day> sharp|exactly", -4.204692619390966),
-                                    ("minute", -2.0074680420547466)],
-                               n = 61},
-                   koData =
-                     ClassData{prior = -2.412933150162911, unseen = -3.2188758248682006,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -1.2321436812926323),
-                                    ("hour", -1.2321436812926323)],
-                               n = 6}}),
-       ("December",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("absorption of , after named day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("on <date>", -2.1972245773362196),
-                                    ("Wednesday", -2.6026896854443837),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Monday", -2.1972245773362196),
-                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
-                                    ("Sunday", -2.6026896854443837)],
-                               n = 10},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("September",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("tonight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("last|past|next <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
-                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
-                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
-                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
-                                    ("minute", -2.639057329615259)],
-                               n = 31},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the ides of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("on <date>",
-        Classifier{okData =
-                     ClassData{prior = -0.1670540846631662, unseen = -4.007333185232471,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -1.791759469228055), ("mm/dd", -3.295836866004329),
-                                    ("absorption of , after named day", -2.890371757896165),
-                                    ("intersect", -2.890371757896165),
-                                    ("Saturday", -2.6026896854443837),
-                                    ("Friday", -3.295836866004329), ("day", -0.8979415932059586),
-                                    ("the <day-of-month> (ordinal)", -2.890371757896165),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -2.6026896854443837),
-                                    ("hour", -3.295836866004329)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -1.8718021769015913,
-                               unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.791759469228055)],
-                               n = 4}}),
-       ("integer (0..19)",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.784189633918261,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 42},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("between <time-of-day> and <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -0.916290731874155),
-                                    ("hh:mmhh:mm", -0.916290731874155)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -0.916290731874155),
-                                    ("minutehour", -0.916290731874155)],
-                               n = 3}}),
-       ("Halloween",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -1.6094379124341003),
-                                    ("month", -0.916290731874155),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("October",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from|since|after <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742, unseen = -4.02535169073515,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("July", -3.3141860046725258),
-                                    ("time-of-day (latent)", -2.3978952727983707),
-                                    ("<time-of-day> am|pm", -2.3978952727983707),
-                                    ("hh:mm", -2.3978952727983707), ("hour", -1.8101086078962516),
-                                    ("month", -2.908720896564361), ("minute", -2.3978952727983707),
-                                    ("August", -3.3141860046725258)],
-                               n = 14},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -4.836281906951478,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.7297014486341915),
-                                    ("week", -4.135166556742356),
-                                    ("<day-of-month> (ordinal or number) <named-month>",
-                                     -4.135166556742356),
-                                    ("today", -4.135166556742356),
-                                    ("intersect", -2.7488721956224653),
-                                    ("second", -4.135166556742356), ("now", -3.4420193761824103),
-                                    ("tomorrow", -3.7297014486341915),
-                                    ("this|last|next <cycle>", -4.135166556742356),
-                                    ("day", -1.995100393246085),
-                                    ("time-of-day (latent)", -4.135166556742356),
-                                    ("<time-of-day> am|pm", -3.7297014486341915),
-                                    ("nograin", -3.4420193761824103),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -4.135166556742356),
-                                    ("Christmas", -3.4420193761824103),
-                                    ("hour", -2.8824035882469876),
-                                    ("<datetime> - <datetime> (interval)", -2.7488721956224653),
-                                    ("<time-of-day> - <time-of-day> (interval)",
-                                     -2.430418464503931),
-                                    ("<named-month> <day-of-month> (non ordinal)",
-                                     -3.7297014486341915),
-                                    ("minute", -1.6928195213731514),
-                                    ("right now", -4.135166556742356),
-                                    ("<month> dd-dd (interval)", -3.4420193761824103),
-                                    ("dd-dd <month> (interval)", -3.7297014486341915)],
-                               n = 49}}),
-       ("month (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> more <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> o'clock",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in|within|after <duration>",
-        Classifier{okData =
-                     ClassData{prior = -4.652001563489282e-2,
-                               unseen = -4.61512051684126,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -3.2188758248682006),
-                                    ("<integer> more <unit-of-duration>", -3.912023005428146),
-                                    ("three-quarters of an hour", -2.995732273553991),
-                                    ("<integer> + '\"", -3.2188758248682006),
-                                    ("number.number hours", -3.912023005428146),
-                                    ("second", -3.506557897319982), ("day", -3.2188758248682006),
-                                    ("half an hour", -2.995732273553991),
-                                    ("<integer> <unit-of-duration>", -1.6094379124341003),
-                                    ("a <unit-of-duration>", -2.995732273553991),
-                                    ("quarter of an hour", -2.995732273553991),
-                                    ("hour", -2.5257286443082556),
-                                    ("about|exactly <duration>", -3.912023005428146),
-                                    ("<integer> and an half hour", -3.912023005428146),
-                                    ("minute", -1.2729656758128873)],
-                               n = 42},
-                   koData =
-                     ClassData{prior = -3.0910424533583156, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -1.8971199848858813),
-                                    ("<integer> <unit-of-duration>", -2.3025850929940455),
-                                    ("a <unit-of-duration>", -2.3025850929940455)],
-                               n = 2}}),
-       ("three-quarters of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Wednesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> + '\"",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half <integer> (UK style hour-of-day)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("July",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hour (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.8209805520698302,
-                               unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
-       ("<ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
-                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
-                                     -1.466337068793427),
-                                    ("quarter", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
-                                    ("quarter", -0.8109302162163288)],
-                               n = 3}}),
-       ("one twenty two",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("intersect",
-        Classifier{okData =
-                     ClassData{prior = -0.4957877464014501, unseen = -6.293419278846481,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<datetime> - <datetime> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.345658990503007),
-                                    ("hourday", -3.8936738667599493),
-                                    ("dayhour", -2.765208614942159),
-                                    ("daymonth", -4.90527477843843),
-                                    ("monthday", -5.19295685089021),
-                                    ("monthyear", -3.9889840465642745),
-                                    ("Tuesdaythe <day-of-month> (ordinal)", -5.598421958998375),
-                                    ("Christmasyear", -5.598421958998375),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.598421958998375),
-                                    ("houryear", -5.598421958998375),
-                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.90527477843843),
-                                    ("<time-of-day> am|pmintersect", -4.345658990503007),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -5.598421958998375),
-                                    ("Marchyear", -5.598421958998375),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year",
-                                     -5.19295685089021),
-                                    ("intersect<time-of-day> am|pm", -5.598421958998375),
-                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -5.598421958998375),
-                                    ("monthhour", -5.19295685089021),
-                                    ("last <day-of-week> of <time>year", -5.598421958998375),
-                                    ("todayat <time-of-day>", -5.598421958998375),
-                                    ("Thursday<time> timezone", -3.8936738667599493),
-                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
-                                     -5.598421958998375),
-                                    ("dayday", -3.58351893845611),
-                                    ("Thanksgiving Dayyear", -4.499809670330265),
-                                    ("<time> <part-of-day>at <time-of-day>", -5.598421958998375),
-                                    ("Tuesdayin <named-month>", -5.598421958998375),
-                                    ("mm/ddat <time-of-day>", -5.598421958998375),
-                                    ("tonightat <time-of-day>", -5.598421958998375),
-                                    ("<time-of-day> am|pmabsorption of , after named day",
-                                     -4.90527477843843),
-                                    ("today<time-of-day> am|pm", -5.598421958998375),
-                                    ("Februarythe <day-of-month> (ordinal)", -5.19295685089021),
-                                    ("at <time-of-day><time> <part-of-day>", -5.598421958998375),
-                                    ("mm/dd<time-of-day> am|pm", -5.598421958998375),
-                                    ("hourhour", -4.345658990503007),
-                                    ("<time-of-day> am|pmon <date>", -3.58351893845611),
-                                    ("Wednesdaythis|last|next <cycle>", -5.598421958998375),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -4.0943445622221),
-                                    ("dayyear", -3.1560749236291703),
-                                    ("last weekend of <named-month>year", -5.598421958998375),
-                                    ("<time-of-day> o'clockin|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursdayat <time-of-day>", -5.19295685089021),
-                                    ("<time-of-day> am|pmtomorrow", -4.90527477843843),
-                                    ("minutehour", -4.68213122712422),
-                                    ("Mother's Dayyear", -5.598421958998375),
-                                    ("at <time-of-day>in|during the <part-of-day>",
-                                     -5.19295685089021),
-                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -3.8936738667599493),
-                                    ("for <duration> from <time>December", -5.598421958998375),
-                                    ("tomorrow<time-of-day> sharp|exactly", -5.598421958998375),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -5.19295685089021),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.68213122712422),
-                                    ("Mondayin|during the <part-of-day>", -5.598421958998375),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.19295685089021),
-                                    ("intersectin|during the <part-of-day>", -5.598421958998375),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -4.68213122712422),
-                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.345658990503007),
-                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -4.68213122712422),
-                                    ("at <time-of-day>intersect", -5.19295685089021),
-                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.598421958998375),
-                                    ("dayminute", -2.924273309571846),
-                                    ("from <datetime> - <datetime> (interval)on <date>",
-                                     -5.19295685089021),
-                                    ("<datetime> - <datetime> (interval)tomorrow",
-                                     -5.598421958998375),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.19295685089021),
-                                    ("<ordinal> <cycle> of <time>year", -5.598421958998375),
-                                    ("minuteday", -2.132686056198648),
-                                    ("absorption of , after named dayintersect",
-                                     -5.598421958998375),
-                                    ("Octoberyear", -4.345658990503007),
-                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
-                                     -5.598421958998375),
-                                    ("at <time-of-day>absorption of , after named day",
-                                     -5.598421958998375),
-                                    ("<day-of-month> (ordinal or number) <named-month>year",
-                                     -5.598421958998375),
-                                    ("year<time-of-day> am|pm", -5.598421958998375),
-                                    ("Septemberyear", -5.19295685089021),
-                                    ("at <time-of-day>on <date>", -4.499809670330265),
-                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
-                                     -4.90527477843843),
-                                    ("Halloweenyear", -5.598421958998375),
-                                    ("dayweek", -5.598421958998375),
-                                    ("Thursday<time-of-day> am|pm", -5.598421958998375),
-                                    ("weekyear", -5.19295685089021),
-                                    ("hh:mmin|during the <part-of-day>", -4.90527477843843),
-                                    ("Father's Dayyear", -5.598421958998375),
-                                    ("<cycle> after|before <time><time-of-day> am|pm",
-                                     -5.19295685089021),
-                                    ("February<time> <part-of-day>", -5.598421958998375),
-                                    ("Martin Luther King's Dayyear", -5.19295685089021),
-                                    ("tomorrowat <time-of-day>", -4.90527477843843),
-                                    ("between <time> and <time>on <date>", -4.90527477843843),
-                                    ("Thursdayfrom|since|after <time-of-day>", -4.90527477843843),
-                                    ("at <time-of-day>tomorrow", -5.19295685089021),
-                                    ("tomorrow<time-of-day> am|pm", -5.598421958998375),
-                                    ("in|during the <part-of-day>at <time-of-day>",
-                                     -5.598421958998375),
-                                    ("Labor Dayyear", -5.598421958998375),
-                                    ("Februaryintersect", -5.598421958998375),
-                                    ("last <cycle> of <time>year", -4.90527477843843),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -5.598421958998375),
-                                    ("yearminute", -5.598421958998375),
-                                    ("Black Fridayyear", -5.19295685089021)],
-                               n = 201},
-                   koData =
-                     ClassData{prior = -0.9392802500988537, unseen = -5.983936280687191,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("in <named-month>year", -5.288267030694535),
-                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
-                                     -5.288267030694535),
-                                    ("hourday", -5.288267030694535),
-                                    ("<named-month> <day-of-month> (non ordinal)July",
-                                     -5.288267030694535),
-                                    ("dayhour", -2.890371757896165),
-                                    ("daymonth", -3.2088254890146994),
-                                    ("monthday", -4.882801922586371),
-                                    ("monthyear", -4.59511985013459),
-                                    ("intersecthh:mm", -5.288267030694535),
-                                    ("from <datetime> - <datetime> (interval)July",
-                                     -5.288267030694535),
-                                    ("houryear", -5.288267030694535),
-                                    ("from <time-of-day> - <time-of-day> (interval)July",
-                                     -5.288267030694535),
-                                    ("until <time-of-day><time-of-day> am|pm", -5.288267030694535),
-                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.59511985013459),
-                                    ("<time-of-day> am|pmintersect", -4.035504062199167),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.37197629882038),
-                                    ("from|since|after <time-of-day>on <date>", -4.37197629882038),
-                                    ("July<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("absorption of , after named dayJuly", -4.882801922586371),
-                                    ("monthhour", -5.288267030694535),
-                                    ("hourmonth", -4.59511985013459),
-                                    ("todayat <time-of-day>", -5.288267030694535),
-                                    ("from|since|after <time-of-day>July", -5.288267030694535),
-                                    ("dayday", -4.882801922586371),
-                                    ("mm/ddat <time-of-day>", -4.882801922586371),
-                                    ("<time-of-day> am|pmon <date>", -4.035504062199167),
-                                    ("dayyear", -4.035504062199167),
-                                    ("Thursdaymm/dd", -5.288267030694535),
-                                    ("Thursdayat <time-of-day>", -4.035504062199167),
-                                    ("<integer> to|till|before <hour-of-day>September",
-                                     -5.288267030694535),
-                                    ("monthminute", -5.288267030694535),
-                                    ("<time-of-day> am|pmtomorrow", -5.288267030694535),
-                                    ("Thursdayhh:mm", -4.37197629882038),
-                                    ("August<day-of-month> (ordinal or number) <named-month>",
-                                     -5.288267030694535),
-                                    ("Fridayyear", -4.882801922586371),
-                                    ("minutemonth", -3.4965075614664802),
-                                    ("Sundayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.882801922586371),
-                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("Aprilyear", -5.288267030694535),
-                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.288267030694535),
-                                    ("<duration> after|before|from <time>December",
-                                     -5.288267030694535),
-                                    ("yesterday<time-of-day> am|pm", -5.288267030694535),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -4.37197629882038),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.882801922586371),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -5.288267030694535),
-                                    ("until <time-of-day>on <date>", -4.59511985013459),
-                                    ("at <time-of-day>intersect", -4.882801922586371),
-                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("dayminute", -2.7625383863862796),
-                                    ("intersectSeptember", -3.784189633918261),
-                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -5.288267030694535),
-                                    ("minuteday", -2.3704962986102562),
-                                    ("absorption of , after named dayintersect",
-                                     -5.288267030694535),
-                                    ("Februaryin|during the <part-of-day>", -5.288267030694535),
-                                    ("week-endin <named-month>", -5.288267030694535),
-                                    ("Octoberyear", -5.288267030694535),
-                                    ("from|since|after <time-of-day>year", -5.288267030694535),
-                                    ("yearhh:mm", -5.288267030694535),
-                                    ("hh:mmon <date>", -3.784189633918261),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -5.288267030694535),
-                                    ("absorption of , after named daySeptember", -4.37197629882038),
-                                    ("on <date>September", -4.882801922586371),
-                                    ("at <time-of-day>on <date>", -4.882801922586371),
-                                    ("dayweek", -5.288267030694535),
-                                    ("Thursday<time-of-day> am|pm", -4.882801922586371),
-                                    ("absorption of , after named dayFebruary", -4.37197629882038),
-                                    ("July<integer> to|till|before <hour-of-day>",
-                                     -5.288267030694535),
-                                    ("tomorrowat <time-of-day>", -5.288267030694535),
-                                    ("<integer> to|till|before <hour-of-day>July",
-                                     -5.288267030694535),
-                                    ("Thursdayfrom|since|after <time-of-day>", -3.6788291182604347),
-                                    ("tomorrow<time-of-day> am|pm", -5.288267030694535),
-                                    ("Tuesdayfrom|since|after <time-of-day>", -5.288267030694535),
-                                    ("yearminute", -5.288267030694535)],
-                               n = 129}}),
-       ("one eleven",
-        Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("after lunch/work/school",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("early morning",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <number> (implicit minutes)",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.3184537311185346),
-                                    ("integer (0..19)", -1.2992829841302609)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.16251892949777494),
-                                    ("integer (0..19)", -1.8971199848858813)],
-                               n = 18}}),
-       ("<ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -2.0149030205422647),
-                                    ("quarteryear", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
-                                     -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
-                                     -2.0149030205422647),
-                                    ("weekmonth", -1.6094379124341003),
-                                    ("ordinal (digits)quarter (grain)year", -2.0149030205422647),
-                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
-                                     -2.0149030205422647)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("year (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.1354942159291497,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 21},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -1.0116009116784799,
-                               unseen = -3.6375861597263857,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -2.001480000210124),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("hh:mmhh:mm", -2.001480000210124),
-                                    ("dayday", -2.512305623976115),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
-                                     -2.917770732084279),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
-                                    ("hourhour", -2.512305623976115),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.45198512374305727,
-                               unseen = -3.912023005428146,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hourday", -3.1986731175506815),
-                                    ("dayhour", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)time-of-day (latent)",
-                                     -3.1986731175506815),
-                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
-                                    ("minuteminute", -2.793208009442517),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.793208009442517),
-                                    ("dayday", -3.1986731175506815),
-                                    ("hourhour", -2.505525936990736),
-                                    ("dayyear", -3.1986731175506815),
-                                    ("<named-month>|<named-day> <day-of-month> (ordinal)past year (latent)",
-                                     -3.1986731175506815),
-                                    ("minutehour", -2.2823823856765264),
-                                    ("hh:mmintersect", -2.793208009442517),
-                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<time-of-day> am|pm",
-                                     -3.1986731175506815),
-                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
-                                     -3.1986731175506815),
-                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
-                                     -3.1986731175506815)],
-                               n = 14}}),
-       ("Saturday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekmonth", -1.7346010553881064),
-                                    ("week (grain)October", -1.7346010553881064),
-                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
-                                     -1.7346010553881064),
-                                    ("weekday", -1.2237754316221157)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("number.number hours",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("from <time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.6094379124341003),
-                                    ("hh:mmhh:mm", -1.6094379124341003),
-                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
-                                    ("hourhour", -2.3025850929940455),
-                                    ("hourminute", -2.3025850929940455),
-                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
-                                     -2.70805020110221),
-                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
-                                    ("time-of-day (latent)time-of-day (latent)",
-                                     -2.0149030205422647),
-                                    ("hourhour", -1.791759469228055),
-                                    ("minutehour", -1.6094379124341003),
-                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
-                               n = 9}}),
-       ("integer 21..99",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
-                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
-                               n = 4}}),
-       ("yyyy-mm-dd",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("mm/dd/yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -1.6094379124341003,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("Monday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("yesterday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<ordinal> quarter <year>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh:mm:ss",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<hour-of-day> <integer>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
-                                    ("hour", -0.9808292530117262),
-                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -1.9459101490553135,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>integer (numeric)",
-                                     -1.0986122886681098),
-                                    ("hour", -1.0986122886681098)],
-                               n = 1}}),
-       ("nth <time> of <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.9808292530117262),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -2.0794415416798357),
-                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
-                                     -1.6739764335716716),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
-                                     -1.6739764335716716)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -0.9808292530117262,
-                               unseen = -2.5649493574615367,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -1.0986122886681098),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
-                                     -1.791759469228055),
-                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
-                                     -1.3862943611198906)],
-                               n = 3}}),
-       ("Valentine's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("April",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("end of month",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("week (grain)",
-        Classifier{okData =
-                     ClassData{prior = -8.004270767353637e-2,
-                               unseen = -3.6375861597263857,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 36},
-                   koData =
-                     ClassData{prior = -2.5649493574615367,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("<part-of-day> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -1.6094379124341003),
-                                    ("hourday", -0.916290731874155),
-                                    ("part of daysthe <day-of-month> (ordinal)",
-                                     -1.6094379124341003),
-                                    ("part of daysthe <day-of-month> (number)",
-                                     -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("past year (latent)",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 2}}),
-       ("six thirty six a.m.",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -1.252762968495368),
-                                    ("one twenty two", -0.8472978603872037),
-                                    ("one eleven", -1.252762968495368)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("now",
-        Classifier{okData =
-                     ClassData{prior = -0.15415067982725836,
-                               unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -1.9459101490553135,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("<day-of-month> (ordinal or number) of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.13353139262452263,
-                               unseen = -3.0910424533583156,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)July", -2.3513752571634776),
-                                    ("ordinals (first..twentieth,thirtieth,...)March",
-                                     -2.3513752571634776),
-                                    ("ordinal (digits)February", -2.3513752571634776),
-                                    ("integer (numeric)February", -1.9459101490553135),
-                                    ("month", -0.9650808960435872),
-                                    ("ordinal (digits)March", -2.3513752571634776),
-                                    ("integer (numeric)July", -2.3513752571634776)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -2.0794415416798357,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)February", -1.5040773967762742),
-                                    ("month", -1.5040773967762742)],
-                               n = 1}}),
-       ("this <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.6931471805599453),
-                                    ("part of days", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Friday",
-        Classifier{okData =
-                     ClassData{prior = -0.3677247801253174,
-                               unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
-                   koData =
-                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("in|during the <part-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -8.701137698962981e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("early morning", -2.5257286443082556),
-                                    ("hour", -0.7339691750802004),
-                                    ("part of days", -0.8209805520698302)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour", -0.916290731874155),
-                                    ("part of days", -0.916290731874155)],
-                               n = 1}}),
-       ("tomorrow",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hh(:mm) - <time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this|last|next <cycle>",
-        Classifier{okData =
-                     ClassData{prior = -0.15822400521489416,
-                               unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.5488132906176655),
-                                    ("month (grain)", -2.995732273553991),
-                                    ("year (grain)", -1.817077277212345),
-                                    ("week (grain)", -1.5488132906176655),
-                                    ("quarter", -2.772588722239781), ("year", -1.817077277212345),
-                                    ("month", -2.995732273553991),
-                                    ("quarter (grain)", -2.772588722239781)],
-                               n = 35},
-                   koData =
-                     ClassData{prior = -1.9218125974762528,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -1.4816045409242156),
-                                    ("week (grain)", -1.4816045409242156),
-                                    ("day", -1.9924301646902063),
-                                    ("day (grain)", -1.9924301646902063)],
-                               n = 6}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Eve",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarteryear", -0.6931471805599453),
-                                    ("ordinal (digits)quarter (grain)year", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("noon|midnight|EOD|end of day", -2.1972245773362196),
-                                    ("end of month", -2.1972245773362196),
-                                    ("time-of-day (latent)", -2.1972245773362196),
-                                    ("<time-of-day> am|pm", -2.1972245773362196),
-                                    ("hh:mm", -2.1972245773362196), ("hour", -1.791759469228055),
-                                    ("month", -2.1972245773362196), ("minute", -1.791759469228055)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("half an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2006706954621511,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinals (first..twentieth,thirtieth,...)",
-                                     -1.7047480922384253),
-                                    ("ordinal (digits)", -0.2006706954621511)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -1.7047480922384253,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList [("ordinal (digits)", -0.2876820724517809)],
-                               n = 2}}),
-       ("last weekend of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
-                                    ("month", -0.7731898882334817)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <day-of-month> (number)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("fractional number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
-       ("Sunday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("February",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("minute (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.833213344056216,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <ordinal> quarter",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
-                                    ("quarter", -0.6931471805599453)],
-                               n = 1}}),
-       ("time-of-day (latent)",
-        Classifier{okData =
-                     ClassData{prior = -0.5315058290035293,
-                               unseen = -4.2626798770413155,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.12136085700426748),
-                                    ("integer (0..19)", -2.3025850929940455)],
-                               n = 67},
-                   koData =
-                     ClassData{prior = -0.8860508466844369,
-                               unseen = -3.9318256327243257,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -0.10536051565782628),
-                                    ("integer (0..19)", -2.8134107167600364),
-                                    ("integer 21..99", -3.2188758248682006)],
-                               n = 47}}),
-       ("year",
-        Classifier{okData =
-                     ClassData{prior = -0.23483959107740107, unseen = -3.58351893845611,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 34},
-                   koData =
-                     ClassData{prior = -1.563975538357343, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 9}}),
-       ("last <day-of-week> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("daymonth", -0.916290731874155),
-                                    ("SundayMarch", -1.6094379124341003),
-                                    ("MondayMarch", -1.6094379124341003),
-                                    ("Sundayintersect", -1.6094379124341003)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.1479201300766222,
-                               unseen = -5.0875963352323845,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.4423470353692043),
-                                    ("integer (0..19)year (grain)", -3.289644895756408),
-                                    ("integer (numeric)day (grain)", -2.6835090921860925),
-                                    ("integer (0..19)second (grain) ", -3.6951100038645723),
-                                    ("integer (0..19)hour (grain)", -3.001962823304627),
-                                    ("second", -3.289644895756408),
-                                    ("integer (numeric)second (grain) ", -3.982792076316353),
-                                    ("integer (numeric)year (grain)", -3.6951100038645723),
-                                    ("day", -2.4423470353692043), ("year", -2.8841797876482436),
-                                    ("integer (numeric)week (grain)", -3.001962823304627),
-                                    ("integer (0..19)month (grain)", -3.4719664525503626),
-                                    ("hour", -2.5964977151964628), ("month", -3.1354942159291497),
-                                    ("integer (numeric)minute (grain)", -3.1354942159291497),
-                                    ("integer (0..19)minute (grain)", -3.001962823304627),
-                                    ("integer (numeric)month (grain)", -3.982792076316353),
-                                    ("minute", -2.4423470353692043),
-                                    ("integer (numeric)hour (grain)", -3.4719664525503626),
-                                    ("integer (0..19)day (grain)", -3.6951100038645723),
-                                    ("integer (0..19)week (grain)", -3.1354942159291497)],
-                               n = 69},
-                   koData =
-                     ClassData{prior = -1.984131361875511, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
-                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
-                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
-                               n = 11}}),
-       ("hhmm (latent)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> am|pm",
-        Classifier{okData =
-                     ClassData{prior = -0.2929871246814741,
-                               unseen = -5.3230099791384085,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer after|past <hour-of-day>", -3.9318256327243257),
-                                    ("at <time-of-day>", -2.2270775404859005),
-                                    ("from|since|after <time-of-day>", -3.708682081410116),
-                                    ("<time-of-day> o'clock", -4.219507705176107),
-                                    ("half after|past <hour-of-day>", -4.219507705176107),
-                                    ("time-of-day (latent)", -1.7346010553881064),
-                                    ("hhmm (latent)", -4.624972813284271),
-                                    ("hh:mm", -2.2735975561207935),
-                                    ("quarter after|past <hour-of-day>", -4.624972813284271),
-                                    ("about|exactly <time-of-day>", -4.624972813284271),
-                                    ("until <time-of-day>", -3.9318256327243257),
-                                    ("hour", -1.2237754316221157),
-                                    ("<time-of-day> sharp|exactly", -4.624972813284271),
-                                    ("minute", -1.7346010553881064)],
-                               n = 94},
-                   koData =
-                     ClassData{prior = -1.3705460041517514, unseen = -4.394449154672439,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
-                                    ("from|since|after <time-of-day>", -3.283414346005772),
-                                    ("<hour-of-day> <integer>", -3.6888794541139363),
-                                    ("time-of-day (latent)", -1.0498221244986778),
-                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
-                               n = 32}}),
-       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
-                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Thanksgiving Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of <named-month>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("a <unit-of-duration>",
-        Classifier{okData =
-                     ClassData{prior = -0.5753641449035618,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.0794415416798357),
-                                    ("year (grain)", -2.772588722239781),
-                                    ("second", -2.772588722239781),
-                                    ("week (grain)", -2.0794415416798357),
-                                    ("day", -2.0794415416798357),
-                                    ("minute (grain)", -2.772588722239781),
-                                    ("year", -2.772588722239781),
-                                    ("second (grain) ", -2.772588722239781),
-                                    ("minute", -2.772588722239781),
-                                    ("day (grain)", -2.0794415416798357)],
-                               n = 9},
-                   koData =
-                     ClassData{prior = -0.8266785731844679, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hour (grain)", -1.7227665977411035),
-                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
-                                    ("quarter (grain)", -1.9459101490553135)],
-                               n = 7}}),
-       ("hh:mm",
-        Classifier{okData =
-                     ClassData{prior = -6.782259633876106e-2,
-                               unseen = -4.07753744390572,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 57},
-                   koData =
-                     ClassData{prior = -2.7245795030534206, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("quarter of an hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("second (grain) ",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinals (first..twentieth,thirtieth,...)",
-        Classifier{okData =
-                     ClassData{prior = -6.899287148695143e-2,
-                               unseen = -2.772588722239781,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
-                   koData =
-                     ClassData{prior = -2.70805020110221, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("quarter after|past <hour-of-day>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -0.6931471805599453),
-                                    ("hour", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("the <cycle> after|before <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)tomorrow", -1.252762968495368),
-                                    ("dayday", -0.8472978603872037),
-                                    ("day (grain)yesterday", -1.252762968495368)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("about|exactly <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week", -2.639057329615259),
-                                    ("hh(:mm) - <time-of-day> am|pm", -2.639057329615259),
-                                    ("this|last|next <cycle>", -2.639057329615259),
-                                    ("day", -2.2335922215070942),
-                                    ("time-of-day (latent)", -2.639057329615259),
-                                    ("hhmm (latent)", -2.2335922215070942),
-                                    ("<time-of-day> am|pm", -2.639057329615259),
-                                    ("hour", -1.9459101490553135),
-                                    ("next <time>", -2.639057329615259),
-                                    ("this|next <day-of-week>", -2.639057329615259),
-                                    ("minute", -2.2335922215070942)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.833213344056216,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
-                                    ("time-of-day (latent)", -2.0794415416798357),
-                                    ("hour", -2.0794415416798357)],
-                               n = 2}}),
-       ("intersect by \",\", \"of\", \"from\", \"'s\"",
-        Classifier{okData =
-                     ClassData{prior = -0.48130318449966897,
-                               unseen = -5.170483995038151,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayhour", -3.2188758248682006),
-                                    ("daymonth", -3.2188758248682006),
-                                    ("<named-month> <day-of-month> (non ordinal)Friday",
-                                     -4.471638793363569),
-                                    ("Friday<named-month> <day-of-month> (non ordinal)",
-                                     -3.7784916128036232),
-                                    ("Wednesdayintersect", -4.471638793363569),
-                                    ("Labor Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Black Fridaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year",
-                                     -4.471638793363569),
-                                    ("<part-of-day> of <time>February", -4.471638793363569),
-                                    ("Saturday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Martin Luther King's Daythis|last|next <cycle>",
-                                     -4.471638793363569),
-                                    ("on <date><time-of-day> am|pm", -4.471638793363569),
-                                    ("hourmonth", -4.471638793363569),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.471638793363569),
-                                    ("dayday", -2.5998366164619773),
-                                    ("the <day-of-month> (ordinal)February", -4.0661736852554045),
-                                    ("WednesdayOctober", -4.471638793363569),
-                                    ("Wednesdaythis|last|next <cycle>", -4.0661736852554045),
-                                    ("intersect<named-month> <day-of-month> (non ordinal)",
-                                     -3.5553480614894135),
-                                    ("dayyear", -2.8622008809294686),
-                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.471638793363569),
-                                    ("Thursdayhh:mm", -4.0661736852554045),
-                                    ("Thanksgiving Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("Memorial Daythis|last|next <cycle>", -4.471638793363569),
-                                    ("on <date><named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("TuesdayOctober", -4.471638793363569),
-                                    ("the <day-of-month> (ordinal)March", -4.471638793363569),
-                                    ("Mondaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.0661736852554045),
-                                    ("Fridayintersect", -4.471638793363569),
-                                    ("Thursday<datetime> - <datetime> (interval)",
-                                     -3.7784916128036232),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.5553480614894135),
-                                    ("Tuesdaythis|last|next <cycle>", -4.471638793363569),
-                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
-                                     -4.471638793363569),
-                                    ("dayminute", -2.6798793241355137),
-                                    ("intersectyear", -4.471638793363569),
-                                    ("minuteday", -3.5553480614894135),
-                                    ("this|last|next <cycle>Sunday", -4.471638793363569),
-                                    ("Sundaythis|last|next <cycle>", -4.471638793363569),
-                                    ("intersectintersect", -4.471638793363569),
-                                    ("weekday", -4.471638793363569),
-                                    ("dayweek", -3.373026504695459),
-                                    ("Thursday<time-of-day> am|pm", -4.471638793363569),
-                                    ("Monday<named-month> <day-of-month> (non ordinal)",
-                                     -4.0661736852554045),
-                                    ("<named-month> <day-of-month> (non ordinal)year",
-                                     -4.0661736852554045)],
-                               n = 55},
-                   koData =
-                     ClassData{prior = -0.9622758451159785, unseen = -4.897839799950911,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("week-endJuly", -4.197201947661808),
-                                    ("week-endOctober", -3.5040547671018634),
-                                    ("daymonth", -1.9999773703255892),
-                                    ("TuesdaySeptember", -4.197201947661808),
-                                    ("Wednesdayintersect", -4.197201947661808),
-                                    ("hourmonth", -3.0985896589936988),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"intersect",
-                                     -4.197201947661808),
-                                    ("Fridaythis|last|next <cycle>", -4.197201947661808),
-                                    ("SundayFebruary", -4.197201947661808),
-                                    ("WednesdayOctober", -4.197201947661808),
-                                    ("week-endintersect", -4.197201947661808),
-                                    ("dayyear", -4.197201947661808),
-                                    ("FridayJuly", -3.791736839553644),
-                                    ("<named-month> <day-of-month> (non ordinal)intersect",
-                                     -4.197201947661808),
-                                    ("FridaySeptember", -4.197201947661808),
-                                    ("WednesdayFebruary", -4.197201947661808),
-                                    ("minutemonth", -3.2809112157876537),
-                                    ("SundayMarch", -4.197201947661808),
-                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
-                                     -4.197201947661808),
-                                    ("MondayFebruary", -3.791736839553644),
-                                    ("Fridayintersect", -4.197201947661808),
-                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
-                                     -3.791736839553644),
-                                    ("dayminute", -2.810907586541918),
-                                    ("SaturdaySeptember", -4.197201947661808),
-                                    ("intersectSeptember", -3.2809112157876537),
-                                    ("MondayMarch", -4.197201947661808),
-                                    ("on <date>September", -3.791736839553644),
-                                    ("intersectintersect", -4.197201947661808),
-                                    ("Tuesdayintersect", -4.197201947661808),
-                                    ("Sundayintersect", -4.197201947661808)],
-                               n = 34}}),
-       ("last <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6286086594223742, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Father's Day", -2.6026896854443837),
-                                    ("Martin Luther King's Day", -2.6026896854443837),
-                                    ("Memorial Day", -2.6026896854443837),
-                                    ("Mother's Day", -2.6026896854443837),
-                                    ("day", -1.2163953243244932), ("Sunday", -2.6026896854443837),
-                                    ("Thanksgiving Day", -2.6026896854443837),
-                                    ("hour", -2.6026896854443837), ("Tuesday", -2.6026896854443837),
-                                    ("week-end", -2.6026896854443837)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -0.7621400520468967, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Monday", -2.5257286443082556), ("day", -2.120263536200091),
-                                    ("Sunday", -2.5257286443082556), ("hour", -1.4271163556401458),
-                                    ("week-end", -1.4271163556401458)],
-                               n = 7}}),
-       ("March",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<named-month>|<named-day> <day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Octoberordinal (digits)", -2.120263536200091),
-                                    ("Thursdayordinal (digits)", -2.5257286443082556),
-                                    ("day", -2.120263536200091),
-                                    ("Augustordinal (digits)", -2.5257286443082556),
-                                    ("Marchordinals (first..twentieth,thirtieth,...)",
-                                     -2.120263536200091),
-                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
-                                    ("month", -1.2729656758128873),
-                                    ("Marchordinal (digits)", -2.5257286443082556)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("from|since|after <time-of-day>ordinal (digits)",
-                                     -1.8718021769015913),
-                                    ("Augustordinal (digits)", -1.8718021769015913),
-                                    ("month", -1.466337068793427)],
-                               n = 2}}),
-       ("Labor Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month> (ordinal)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("until <time-of-day>",
-        Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("time-of-day (latent)", -2.3025850929940455),
-                                    ("<time-of-day> am|pm", -1.6094379124341003),
-                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
-                                    ("minute", -1.3862943611198906)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersect", -1.7227665977411035),
-                                    ("yesterday", -2.2335922215070942),
-                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
-                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
-                               n = 10}}),
-       ("mm.dd.yyyy",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<duration> after|before|from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -3.4339872044851463,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("a <unit-of-duration>now", -2.70805020110221),
-                                    ("a <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>today", -2.70805020110221),
-                                    ("daysecond", -2.70805020110221),
-                                    ("a <unit-of-duration>right now", -2.70805020110221),
-                                    ("minutenograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>Christmas", -2.70805020110221),
-                                    ("secondnograin", -2.70805020110221),
-                                    ("yearday", -2.0149030205422647),
-                                    ("daynograin", -2.70805020110221),
-                                    ("<integer> <unit-of-duration>now", -2.3025850929940455)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.1354942159291497,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -2.3978952727983707),
-                                    ("dayday", -1.9924301646902063),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -2.3978952727983707),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -2.3978952727983707)],
-                               n = 3}}),
-       ("Independence Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("decimal number",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
-       ("next <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5263605246161616,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Martin Luther King's Day", -2.803360380906535),
-                                    ("Halloween", -2.803360380906535),
-                                    ("Wednesday", -2.803360380906535),
-                                    ("Memorial Day", -2.803360380906535),
-                                    ("Monday", -2.803360380906535),
-                                    ("Mother's Day", -2.803360380906535),
-                                    ("day", -1.0986122886681098),
-                                    ("Thanksgiving Day", -2.803360380906535),
-                                    ("March", -2.803360380906535), ("month", -2.803360380906535),
-                                    ("Tuesday", -2.1102132003465894)],
-                               n = 11},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.4849066497880004,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time-of-day> sharp|exactly",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("at <time-of-day>", -2.1400661634962708),
-                                    ("time-of-day (latent)", -2.1400661634962708),
-                                    ("hhmm (latent)", -2.1400661634962708),
-                                    ("<time-of-day> am|pm", -2.1400661634962708),
-                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
-                                    ("minute", -1.4469189829363254)],
-                               n = 5},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("negative numbers",
-        Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0},
-                   koData =
-                     ClassData{prior = 0.0, unseen = -3.332204510175204,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)", -7.696104113612832e-2),
-                                    ("integer (0..19)", -2.6026896854443837)],
-                               n = 25}}),
-       ("about|exactly <duration>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("half an hour", -0.6931471805599453),
-                                    ("minute", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<time> before last|after next",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Wednesday", -1.8718021769015913),
-                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
-                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
-                               n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("by the end of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("this|last|next <cycle>", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("hhmm (military) am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<datetime> - <datetime> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("intersecthh:mm", -3.1918471524802814),
-                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
-                                    ("minuteminute", -1.457246097092175),
-                                    ("hh:mmhh:mm", -2.093234863812172),
-                                    ("dayday", -3.1918471524802814),
-                                    ("hourhour", -2.093234863812172),
-                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
-                                     -3.1918471524802814),
-                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.597312260588446),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
-                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
-                               n = 26},
-                   koData =
-                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<named-month> <day-of-month> (non ordinal)July",
-                                     -3.1135153092103742),
-                                    ("daymonth", -2.70805020110221),
-                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
-                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
-                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
-                                    ("minuteminute", -1.8607523407150064),
-                                    ("hourhour", -2.70805020110221),
-                                    ("minutehour", -2.70805020110221),
-                                    ("hh:mmintersect", -2.1972245773362196),
-                                    ("<named-month> <day-of-month> (non ordinal)August",
-                                     -3.1135153092103742),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.1135153092103742)],
-                               n = 12}}),
-       ("Tuesday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("New Year's Day",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("fortnight",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Memorial Day weekend",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<integer> and an half hour",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("in <named-month>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -1.252762968495368), ("March", -1.252762968495368),
-                                    ("month", -0.8472978603872037)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -0.6931471805599453,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("October", -0.8472978603872037),
-                                    ("month", -0.8472978603872037)],
-                               n = 2}}),
-       ("<time-of-day> - <time-of-day> (interval)",
-        Classifier{okData =
-                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.529395204760564),
-                                    ("hh:mmhh:mm", -1.8971199848858813),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -2.4849066497880004),
-                                    ("hourhour", -1.6964492894237302),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -3.4011973816621555),
-                                    ("from|since|after <time-of-day><time-of-day> am|pm",
-                                     -3.4011973816621555),
-                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
-                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
-                               n = 22},
-                   koData =
-                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("about|exactly <time-of-day>time-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
-                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
-                                    ("<time-of-day> am|pmtime-of-day (latent)",
-                                     -3.4657359027997265),
-                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
-                                    ("hourhour", -2.2129729343043585),
-                                    ("minutehour", -1.2144441041932315),
-                                    ("about|exactly <time-of-day><time-of-day> am|pm",
-                                     -3.4657359027997265),
-                                    ("from|since|after <time-of-day>time-of-day (latent)",
-                                     -2.5494451709255714),
-                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
-                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
-                                     -3.0602707946915624)],
-                               n = 24}}),
-       ("military spelled out numbers am|pm",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods =
-                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("winter",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("nth <time> after <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
-                                     -0.916290731874155)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayday", -0.916290731874155),
-                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
-                                     -0.916290731874155)],
-                               n = 1}}),
-       ("<named-month> <day-of-month> (non ordinal)",
-        Classifier{okData =
-                     ClassData{prior = -0.42121346507630353,
-                               unseen = -3.951243718581427,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.5455312716044354),
-                                    ("Marchinteger (numeric)", -2.833213344056216),
-                                    ("Aprilinteger (numeric)", -3.2386784521643803),
-                                    ("month", -0.8407831793660099),
-                                    ("Februaryinteger (numeric)", -1.9859154836690123),
-                                    ("Septemberinteger (numeric)", -2.833213344056216),
-                                    ("Octoberinteger (numeric)", -2.833213344056216),
-                                    ("Julyinteger (numeric)", -2.1400661634962708)],
-                               n = 21},
-                   koData =
-                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Augustinteger (numeric)", -2.3353749158170367),
-                                    ("Marchinteger (numeric)", -2.740840023925201),
-                                    ("Aprilinteger (numeric)", -2.740840023925201),
-                                    ("month", -0.9490805546971459),
-                                    ("from|since|after <time-of-day>integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("Julyinteger (numeric)", -1.6422277352570913)],
-                               n = 11}}),
-       ("this|next <day-of-week>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.2512917986064953),
-                                    ("Wednesday", -2.2512917986064953),
-                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
-                                    ("Tuesday", -1.55814461804655)],
-                               n = 7},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("ordinal (digits)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.5553480614894135,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 33},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("quarter (grain)",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
-                   koData =
-                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
-       ("last <cycle> of <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day (grain)October", -1.791759469228055),
-                                    ("daymonth", -1.2809338454620642),
-                                    ("day (grain)intersect", -1.791759469228055),
-                                    ("weekmonth", -1.791759469228055),
-                                    ("week (grain)intersect", -2.1972245773362196),
-                                    ("week (grain)September", -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("<day-of-month>(ordinal) <named-month> year",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("ordinal (digits)April", -0.6931471805599453),
-                                    ("month", -0.6931471805599453)],
-                               n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Black Friday",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Labor Day",
-        Classifier{okData =
-                     ClassData{prior = -0.2876820724517809,
-                               unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -1.3862943611198906,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("week-end",
-        Classifier{okData =
-                     ClassData{prior = -1.5040773967762742,
-                               unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -0.25131442828090605,
-                               unseen = -2.1972245773362196,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 7}}),
-       ("day (grain)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.2188758248682006,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("right now",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("for <duration> from <time>",
-        Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.3025850929940455,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
-                                     -1.5040773967762742),
-                                    ("dayday", -1.0986122886681098),
-                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
-                                     -1.5040773967762742)],
-                               n = 2},
-                   koData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.0794415416798357,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("dayhour", -1.252762968495368),
-                                    ("<integer> <unit-of-duration>time-of-day (latent)",
-                                     -1.252762968495368)],
-                               n = 1}}),
-       ("between <time> and <time>",
-        Classifier{okData =
-                     ClassData{prior = -1.0986122886681098,
-                               unseen = -2.4849066497880004,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("minuteminute", -1.0116009116784799),
-                                    ("hh:mmhh:mm", -1.0116009116784799)],
-                               n = 3},
-                   koData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -2.890371757896165,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("hh:mmtime-of-day (latent)", -1.4469189829363254),
-                                    ("minuteminute", -1.4469189829363254),
-                                    ("minutehour", -1.4469189829363254),
-                                    ("hh:mmintersect", -1.4469189829363254)],
-                               n = 6}}),
-       ("<month> dd-dd (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
-                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
-                                     -2.740840023925201),
-                                    ("Augustordinal (digits)integer (numeric)",
-                                     -2.3353749158170367),
-                                    ("month", -0.8690378470236094),
-                                    ("Augustordinal (digits)ordinal (digits)",
-                                     -2.3353749158170367)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("part of days",
-        Classifier{okData =
-                     ClassData{prior = -4.0821994520255166e-2,
-                               unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
-                   koData =
-                     ClassData{prior = -3.2188758248682006,
-                               unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
-       ("summer",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("dd-dd <month> (interval)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("integer (numeric)integer (numeric)September",
-                                     -1.791759469228055),
-                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
-                                    ("ordinal (digits)ordinal (digits)October",
-                                     -2.1972245773362196),
-                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
-                                    ("month", -0.9444616088408514),
-                                    ("ordinal (digits)ordinal (digits)August",
-                                     -2.1972245773362196)],
-                               n = 6},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("this <time>",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.258096538021482,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("Thursday", -2.5257286443082556),
-                                    ("Martin Luther King's Day", -2.5257286443082556),
-                                    ("Monday", -2.5257286443082556), ("day", -1.1394342831883648),
-                                    ("Thanksgiving Day", -2.5257286443082556),
-                                    ("hour", -2.5257286443082556), ("winter", -2.5257286443082556),
-                                    ("week-end", -2.5257286443082556),
-                                    ("summer", -2.120263536200091)],
-                               n = 8},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -2.3025850929940455,
+      [("Bhai Dooj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -2.0794415416798357, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)noon|midnight|EOD|end of day",
+                                     -0.916290731874155),
+                                    ("hour", -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.7537718023763802),
+                                    ("integer (numeric)time-of-day (latent)", -0.7537718023763802)],
+                               n = 7}}),
+       ("<time> timezone",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -1.824549292051046),
+                                    ("<time-of-day> am|pm", -1.6422277352570913),
+                                    ("hh:mm", -1.824549292051046), ("hour", -1.1314021114911006),
+                                    ("minute", -1.824549292051046)],
+                               n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thursday",
+        Classifier{okData =
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.4657359027997265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 30},
+                   koData =
+                     ClassData{prior = -2.3978952727983707,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("integer (numeric)",
+        Classifier{okData =
+                     ClassData{prior = -0.6231370149872965, unseen = -5.645446897643238,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 281},
+                   koData =
+                     ClassData{prior = -0.7684302409804936,
+                               unseen = -5.5012582105447265,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 243}}),
+       ("<duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.784189633918261,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.563975538357343), ("day", -1.8152899666382492),
+                                    ("year", -2.662587827025453),
+                                    ("<integer> <unit-of-duration>", -1.0531499145913523),
+                                    ("a <unit-of-duration>", -2.662587827025453),
+                                    ("month", -2.662587827025453),
+                                    ("fortnight", -2.662587827025453)],
+                               n = 18},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year", -1.466337068793427),
+                                    ("<integer> <unit-of-duration>", -1.1786549963416462),
+                                    ("month", -1.8718021769015913)],
+                               n = 3}}),
+       ("noon|midnight|EOD|end of day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter to|till|before <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.6739764335716716),
+                                    ("dayday", -1.1631508098056809),
+                                    ("day (grain)yesterday", -1.6739764335716716)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.6739764335716716),
+                                    ("year (grain)Christmas", -2.0794415416798357),
+                                    ("dayday", -2.0794415416798357),
+                                    ("day (grain)intersect", -1.6739764335716716),
+                                    ("day (grain)Easter Sunday", -2.0794415416798357),
+                                    ("yearday", -2.0794415416798357)],
+                               n = 4}}),
+       ("Easter Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Navaratri",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Martin Luther King's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("integer (20..90)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Shemini Atzeret",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ramadan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lazarus Saturday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect 2 numbers",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("compose by multiplicationinteger (0..19)",
+                                     -0.2231435513142097)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("powers of tensinteger (0..19)", -0.2231435513142097)],
+                               n = 3}}),
+       ("mm/yyyy",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("integer after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.8109302162163288),
+                                    ("integer (numeric)time-of-day (latent)", -1.0986122886681098),
+                                    ("integer (20..90)time-of-day (latent)", -1.5040773967762742)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom HaShoah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal or number) <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)December", -2.1400661634962708),
+                                    ("ordinal (digits)February", -2.1400661634962708),
+                                    ("integer (numeric)April", -2.1400661634962708),
+                                    ("month", -1.4469189829363254)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.4011973816621555,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)October", -2.6741486494265287),
+                                    ("ordinal (digits)July", -2.6741486494265287),
+                                    ("integer (numeric)September", -2.268683541318364),
+                                    ("ordinal (digits)August", -2.6741486494265287),
+                                    ("integer (numeric)August", -2.6741486494265287),
+                                    ("ordinal (digits)April", -2.6741486494265287),
+                                    ("month", -1.0647107369924282),
+                                    ("integer (numeric)July", -2.268683541318364)],
+                               n = 9}}),
+       ("<time> <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -9.237332013101517e-2,
+                               unseen = -4.48863636973214,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("dayhour", -1.4816045409242156),
+                                    ("Mondayearly morning", -3.378724525810097),
+                                    ("time-of-day (latent)tonight", -3.378724525810097),
+                                    ("hourhour", -2.3978952727983707),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("todaypart of days", -3.784189633918261),
+                                    ("minutehour", -2.6855773452501515),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -3.378724525810097),
+                                    ("time-of-day (latent)this <part-of-day>", -3.784189633918261),
+                                    ("Mondayin|during the <part-of-day>", -3.784189633918261),
+                                    ("intersectpart of days", -3.784189633918261),
+                                    ("intersectin|during the <part-of-day>", -3.784189633918261),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("tomorrowpart of days", -2.3978952727983707),
+                                    ("hh:mmin|during the <part-of-day>", -3.0910424533583156),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("hhmm (latent)in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("yesterdaypart of days", -3.378724525810097),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -3.784189633918261),
+                                    ("Mondaypart of days", -3.784189633918261)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -2.4277482359480516,
+                               unseen = -3.4965075614664802,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("yearhour", -2.772588722239781),
+                                    ("monthhour", -2.772588722239781),
+                                    ("hourhour", -2.772588722239781),
+                                    ("year (latent)in|during the <part-of-day>",
+                                     -2.772588722239781),
+                                    ("Februaryin|during the <part-of-day>", -2.772588722239781),
+                                    ("time-of-day (latent)in|during the <part-of-day>",
+                                     -2.772588722239781)],
+                               n = 3}}),
+       ("today",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("mm/dd",
+        Classifier{okData =
+                     ClassData{prior = -1.2729656758128873,
+                               unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
+                   koData =
+                     ClassData{prior = -0.3285040669720361, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18}}),
+       ("at <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.961215868968717e-2,
+                               unseen = -4.948759890378168,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time> timezone", -3.8430301339411947),
+                                    ("noon|midnight|EOD|end of day", -3.8430301339411947),
+                                    ("integer after|past <hour-of-day>", -3.8430301339411947),
+                                    ("half after|past <hour-of-day>", -4.248495242049359),
+                                    ("time-of-day (latent)", -1.6835458845878222),
+                                    ("hhmm (latent)", -3.5553480614894135),
+                                    ("<time-of-day> am|pm", -1.8061482066801546),
+                                    ("hh:mm", -3.332204510175204),
+                                    ("about|exactly <time-of-day>", -3.8430301339411947),
+                                    ("hour", -1.0704414117014134),
+                                    ("<time-of-day> sharp|exactly", -4.248495242049359),
+                                    ("minute", -2.05127066471314)],
+                               n = 64},
+                   koData =
+                     ClassData{prior = -2.456735772821304, unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -1.2321436812926323),
+                                    ("hour", -1.2321436812926323)],
+                               n = 6}}),
+       ("December",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("absorption of , after named day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("on <date>", -2.1972245773362196),
+                                    ("Wednesday", -2.6026896854443837),
+                                    ("Saturday", -2.6026896854443837),
+                                    ("Monday", -2.1972245773362196),
+                                    ("Friday", -1.9095425048844386), ("day", -0.8979415932059586),
+                                    ("Sunday", -2.6026896854443837)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("September",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("tonight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|past|next <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.2626798770413155,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.456735772821304), ("second", -2.639057329615259),
+                                    ("day", -2.3025850929940455), ("year", -2.639057329615259),
+                                    ("<integer> <unit-of-duration>", -0.7827593392496325),
+                                    ("hour", -2.639057329615259), ("month", -2.639057329615259),
+                                    ("minute", -2.639057329615259)],
+                               n = 31},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the ides of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("on <date>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -4.204692619390966,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -1.4816045409242156),
+                                    ("mm/dd", -3.4965075614664802),
+                                    ("absorption of , after named day", -3.0910424533583156),
+                                    ("intersect", -3.0910424533583156),
+                                    ("Saturday", -2.803360380906535),
+                                    ("Friday", -3.4965075614664802), ("day", -0.8574502318512216),
+                                    ("the <day-of-month> (ordinal)", -3.0910424533583156),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.803360380906535),
+                                    ("hour", -3.4965075614664802)],
+                               n = 28},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.791759469228055), ("day", -1.2809338454620642),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -1.791759469228055)],
+                               n = 4}}),
+       ("integer (0..19)",
+        Classifier{okData =
+                     ClassData{prior = -0.11122563511022437,
+                               unseen = -3.970291913552122,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 51},
+                   koData =
+                     ClassData{prior = -2.2512917986064953,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
+       ("between <time-of-day> and <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.7884573603642702),
+                                    ("hh:mmhh:mm", -0.7884573603642702)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -0.7884573603642702),
+                                    ("minutehour", -0.7884573603642702)],
+                               n = 9}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Passover",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6094379124341003),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -1.6094379124341003),
+                                    ("month", -0.916290731874155),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("October",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 16},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from|since|after <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("July", -3.332204510175204),
+                                    ("time-of-day (latent)", -2.4159137783010487),
+                                    ("<time-of-day> am|pm", -2.4159137783010487),
+                                    ("hh:mm", -2.4159137783010487), ("hour", -1.8281271133989299),
+                                    ("month", -2.9267394020670396), ("minute", -2.4159137783010487),
+                                    ("August", -3.332204510175204)],
+                               n = 14},
+                   koData =
+                     ClassData{prior = -0.2231435513142097, unseen = -4.948759890378168,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.8430301339411947),
+                                    ("week", -4.248495242049359),
+                                    ("<day-of-month> (ordinal or number) <named-month>",
+                                     -4.248495242049359),
+                                    ("today", -4.248495242049359),
+                                    ("intersect", -2.3766930651477676),
+                                    ("second", -4.248495242049359), ("now", -3.332204510175204),
+                                    ("tomorrow", -3.8430301339411947),
+                                    ("this|last|next <cycle>", -4.248495242049359),
+                                    ("day", -1.8971199848858813),
+                                    ("time-of-day (latent)", -4.248495242049359),
+                                    ("<time-of-day> am|pm", -3.8430301339411947),
+                                    ("nograin", -3.332204510175204),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -4.248495242049359),
+                                    ("Easter Sunday", -4.248495242049359),
+                                    ("Christmas", -3.5553480614894135),
+                                    ("hour", -2.995732273553991), ("month", -4.248495242049359),
+                                    ("<datetime> - <datetime> (interval)", -2.8622008809294686),
+                                    ("<time-of-day> - <time-of-day> (interval)",
+                                     -2.5437471498109336),
+                                    ("<named-month> <day-of-month> (non ordinal)",
+                                     -3.8430301339411947),
+                                    ("minute", -1.7635885922613588),
+                                    ("right now", -4.248495242049359),
+                                    ("<month> dd-dd (interval)", -3.5553480614894135),
+                                    ("dd-dd <month> (interval)", -3.8430301339411947)],
+                               n = 56}}),
+       ("month (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 18},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> more <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)minute (grain)", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> o'clock",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in|within|after <duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.17062551703076334,
+                               unseen = -4.653960350157523,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -3.258096538021482),
+                                    ("<integer> more <unit-of-duration>", -3.951243718581427),
+                                    ("three-quarters of an hour", -3.0349529867072724),
+                                    ("<integer> + '\"", -3.258096538021482),
+                                    ("number.number hours", -3.951243718581427),
+                                    ("second", -3.545778610473263), ("day", -3.258096538021482),
+                                    ("half an hour", -3.0349529867072724),
+                                    ("year", -3.951243718581427),
+                                    ("<integer> <unit-of-duration>", -1.5998684614179497),
+                                    ("a <unit-of-duration>", -3.0349529867072724),
+                                    ("quarter of an hour", -3.0349529867072724),
+                                    ("hour", -2.5649493574615367),
+                                    ("about|exactly <duration>", -3.951243718581427),
+                                    ("<integer> and an half hour", -3.951243718581427),
+                                    ("minute", -1.3121863889661687)],
+                               n = 43},
+                   koData =
+                     ClassData{prior = -1.8523840910444898,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -2.4277482359480516), ("year", -1.7346010553881064),
+                                    ("<integer> <unit-of-duration>", -1.7346010553881064),
+                                    ("a <unit-of-duration>", -2.1400661634962708),
+                                    ("month", -2.833213344056216)],
+                               n = 8}}),
+       ("January",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("three-quarters of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Mattu Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Wednesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> + '\"",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half <integer> (UK style hour-of-day)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("July",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hour (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.8209805520698302,
+                               unseen = -2.5649493574615367,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                   koData =
+                     ClassData{prior = -0.579818495252942, unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14}}),
+       ("Shavuot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> <duration> hence|ago",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.3862943611198906),
+                                    ("Thanksgiving Day<integer> <unit-of-duration>",
+                                     -1.0986122886681098),
+                                    ("dayyear", -1.3862943611198906),
+                                    ("Diwali<integer> <unit-of-duration>", -1.791759469228055)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -1.1786549963416462),
+                                    ("ordinals (first..twentieth,thirtieth,...)quarter (grain)",
+                                     -1.466337068793427),
+                                    ("quarter", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.8109302162163288),
+                                    ("quarter", -0.8109302162163288)],
+                               n = 3}}),
+       ("Boss's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Orthodox Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("one twenty two",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect",
+        Classifier{okData =
+                     ClassData{prior = -0.459704877045161, unseen = -6.704414354964107,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Navaratriyear (latent)", -6.010040932680917),
+                                    ("Ramadanyear (latent)", -6.010040932680917),
+                                    ("<datetime> - <datetime> (interval)on <date>",
+                                     -4.757277964185549),
+                                    ("Bhai Doojyear (latent)", -6.010040932680917),
+                                    ("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -4.757277964185549),
+                                    ("hourday", -4.305292840442492),
+                                    ("dayhour", -3.092270200596638),
+                                    ("Martin Luther King's Dayyear (latent)", -5.604575824572753),
+                                    ("Shemini Atzeretyear (latent)", -6.010040932680917),
+                                    ("daymonth", -5.316893752120972),
+                                    ("monthday", -5.604575824572753),
+                                    ("monthyear", -4.400603020246817),
+                                    ("Yom Ha'atzmautyear (latent)", -6.010040932680917),
+                                    ("Vijayadashamiyear (latent)", -6.010040932680917),
+                                    ("Thanksgiving Dayyear (latent)", -4.911428644012807),
+                                    ("Thai Pongalyear (latent)", -5.316893752120972),
+                                    ("Thiru Onamyear (latent)", -5.316893752120972),
+                                    ("Tuesdaythe <day-of-month> (ordinal)", -6.010040932680917),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -6.010040932680917),
+                                    ("houryear", -5.316893752120972),
+                                    ("this|next <day-of-week>hh(:mm) - <time-of-day> am|pm",
+                                     -6.010040932680917),
+                                    ("Christmas<time-of-day> am|pm", -6.010040932680917),
+                                    ("last <day-of-week> of <time>year (latent)",
+                                     -6.010040932680917),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.316893752120972),
+                                    ("<time-of-day> am|pmintersect", -4.757277964185549),
+                                    ("Octoberyear (latent)", -4.757277964185549),
+                                    ("intersect<time-of-day> am|pm", -6.010040932680917),
+                                    ("Mattu Pongalyear (latent)", -6.010040932680917),
+                                    ("Shavuotyear (latent)", -6.010040932680917),
+                                    ("Dhanterasin <named-month>|year", -6.010040932680917),
+                                    ("at <time-of-day>in|within|after <duration>",
+                                     -6.010040932680917),
+                                    ("Thursdayhh(:mm) - <time-of-day> am|pm", -6.010040932680917),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -5.604575824572753),
+                                    ("Marchyear (latent)", -6.010040932680917),
+                                    ("Sukkotyear (latent)", -5.604575824572753),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -6.010040932680917),
+                                    ("Clean Mondayyear (latent)", -5.604575824572753),
+                                    ("monthhour", -5.604575824572753),
+                                    ("todayat <time-of-day>", -6.010040932680917),
+                                    ("Thursday<time> timezone", -4.305292840442492),
+                                    ("this <time>hh(:mm) - <time-of-day> am|pm",
+                                     -6.010040932680917),
+                                    ("Palm SundaySunday", -5.604575824572753),
+                                    ("dayday", -3.812816355344698),
+                                    ("<time> <part-of-day>at <time-of-day>", -6.010040932680917),
+                                    ("mm/ddat <time-of-day>", -6.010040932680917),
+                                    ("tonightat <time-of-day>", -6.010040932680917),
+                                    ("<time-of-day> am|pmabsorption of , after named day",
+                                     -5.316893752120972),
+                                    ("today<time-of-day> am|pm", -6.010040932680917),
+                                    ("Februarythe <day-of-month> (ordinal)", -5.604575824572753),
+                                    ("at <time-of-day><time> <part-of-day>", -6.010040932680917),
+                                    ("mm/dd<time-of-day> am|pm", -6.010040932680917),
+                                    ("hourhour", -4.757277964185549),
+                                    ("<time-of-day> am|pmon <date>", -3.9951379121386528),
+                                    ("Wednesdaythis|last|next <cycle>", -6.010040932680917),
+                                    ("Lentyear (latent)", -6.010040932680917),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -4.505963535904644),
+                                    ("Boghiyear (latent)", -6.010040932680917),
+                                    ("dayyear", -2.011840231011719),
+                                    ("<time-of-day> o'clockin|during the <part-of-day>",
+                                     -6.010040932680917),
+                                    ("Thursdayat <time-of-day>", -5.604575824572753),
+                                    ("Islamic New Yearyear (latent)", -5.604575824572753),
+                                    ("Laylat al-Qadryear (latent)", -5.093750200806762),
+                                    ("Chhathin <named-month>|year", -6.010040932680917),
+                                    ("Vasant Panchamiin <named-month>|year", -6.010040932680917),
+                                    ("Diwaliin <named-month>|year", -6.010040932680917),
+                                    ("Shrove Tuesdayyear (latent)", -6.010040932680917),
+                                    ("<time-of-day> am|pmtomorrow", -5.316893752120972),
+                                    ("Yom Kippuryear (latent)", -6.010040932680917),
+                                    ("<part-of-day> of <time>year (latent)", -6.010040932680917),
+                                    ("minutehour", -5.093750200806762),
+                                    ("Kaanum Pongalyear (latent)", -5.604575824572753),
+                                    ("Maha Saptamiyear (latent)", -6.010040932680917),
+                                    ("at <time-of-day>in|during the <part-of-day>",
+                                     -5.604575824572753),
+                                    ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
+                                     -4.305292840442492),
+                                    ("for <duration> from <time>December", -6.010040932680917),
+                                    ("tomorrow<time-of-day> sharp|exactly", -6.010040932680917),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.093750200806762),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -5.604575824572753),
+                                    ("Pentecostyear (latent)", -6.010040932680917),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.093750200806762),
+                                    ("Eid al-Fitryear (latent)", -6.010040932680917),
+                                    ("Mondayin|during the <part-of-day>", -6.010040932680917),
+                                    ("Raksha Bandhanyear (latent)", -6.010040932680917),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.604575824572753),
+                                    ("Navaratriin <named-month>|year", -6.010040932680917),
+                                    ("Ashurayear (latent)", -6.010040932680917),
+                                    ("Chinese New Yearyear (latent)", -6.010040932680917),
+                                    ("Sundayyear (latent)", -6.010040932680917),
+                                    ("Lag BaOmeryear (latent)", -6.010040932680917),
+                                    ("last weekend of <named-month>year (latent)",
+                                     -6.010040932680917),
+                                    ("Eid al-Adhayear (latent)", -5.093750200806762),
+                                    ("intersectin|during the <part-of-day>", -6.010040932680917),
+                                    ("Christmasat <time-of-day>", -6.010040932680917),
+                                    ("Passoveryear (latent)", -6.010040932680917),
+                                    ("Lazarus Saturdayyear (latent)", -6.010040932680917),
+                                    ("<day-of-month> (ordinal or number) <named-month>year (latent)",
+                                     -6.010040932680917),
+                                    ("Yom HaShoahyear (latent)", -5.604575824572753),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -5.093750200806762),
+                                    ("<day-of-month> (ordinal or number) of <named-month>in|during the <part-of-day>",
+                                     -6.010040932680917),
+                                    ("Thai Pongalin <named-month>|year", -6.010040932680917),
+                                    ("Septemberyear (latent)", -5.604575824572753),
+                                    ("mm/ddyear (latent)", -6.010040932680917),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -4.757277964185549),
+                                    ("Halloweenyear (latent)", -6.010040932680917),
+                                    ("from <time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.316893752120972),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -5.093750200806762),
+                                    ("at <time-of-day>intersect", -5.604575824572753),
+                                    ("Rosh Hashanahyear (latent)", -6.010040932680917),
+                                    ("Dhanterasyear (latent)", -6.010040932680917),
+                                    ("Tu BiShvatyear (latent)", -6.010040932680917),
+                                    ("Holiyear (latent)", -5.316893752120972),
+                                    ("<time-of-day> - <time-of-day> (interval)tomorrow",
+                                     -6.010040932680917),
+                                    ("Holika Dahanyear (latent)", -5.316893752120972),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.010040932680917),
+                                    ("dayminute", -3.3709836030656586),
+                                    ("Mawlidyear (latent)", -6.010040932680917),
+                                    ("from <datetime> - <datetime> (interval)on <date>",
+                                     -5.604575824572753),
+                                    ("<datetime> - <datetime> (interval)tomorrow",
+                                     -6.010040932680917),
+                                    ("Jumu'atul-Widayear (latent)", -5.093750200806762),
+                                    ("absorption of , after named dayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -6.010040932680917),
+                                    ("minuteday", -2.3724547729545318),
+                                    ("absorption of , after named dayintersect",
+                                     -6.010040932680917),
+                                    ("intersectyear (latent)", -6.010040932680917),
+                                    ("Orthodox Easter Sundayyear (latent)", -6.010040932680917),
+                                    ("<ordinal> <cycle> of <time>year (latent)",
+                                     -6.010040932680917),
+                                    ("the <day-of-month> (ordinal)in|during the <part-of-day>",
+                                     -6.010040932680917),
+                                    ("Boss's Dayyear (latent)", -5.604575824572753),
+                                    ("Tisha B'Avyear (latent)", -6.010040932680917),
+                                    ("Isra and Mi'rajyear (latent)", -5.093750200806762),
+                                    ("at <time-of-day>absorption of , after named day",
+                                     -6.010040932680917),
+                                    ("Christmasyear (latent)", -5.604575824572753),
+                                    ("Naraka Chaturdashiyear (latent)", -5.604575824572753),
+                                    ("at <time-of-day>on <date>", -4.911428644012807),
+                                    ("between <time-of-day> and <time-of-day> (interval)on <date>",
+                                     -4.400603020246817),
+                                    ("dayweek", -6.010040932680917),
+                                    ("Easter Sundayyear (latent)", -5.316893752120972),
+                                    ("Thursday<time-of-day> am|pm", -6.010040932680917),
+                                    ("weekyear", -5.604575824572753),
+                                    ("hh:mmin|during the <part-of-day>", -5.316893752120972),
+                                    ("<cycle> after|before <time><time-of-day> am|pm",
+                                     -5.604575824572753),
+                                    ("Hanukkahyear (latent)", -6.010040932680917),
+                                    ("February<time> <part-of-day>", -6.010040932680917),
+                                    ("Tuesdayin <named-month>|year", -6.010040932680917),
+                                    ("Great Lentyear (latent)", -6.010040932680917),
+                                    ("tomorrowat <time-of-day>", -5.316893752120972),
+                                    ("between <time> and <time>on <date>", -4.400603020246817),
+                                    ("Thursdayfrom|since|after <time-of-day>", -5.316893752120972),
+                                    ("last <cycle> of <time>year (latent)", -5.316893752120972),
+                                    ("at <time-of-day>tomorrow", -5.604575824572753),
+                                    ("tomorrow<time-of-day> am|pm", -6.010040932680917),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -6.010040932680917),
+                                    ("Diwaliyear (latent)", -6.010040932680917),
+                                    ("Black Fridayyear (latent)", -5.604575824572753),
+                                    ("in|during the <part-of-day>at <time-of-day>",
+                                     -6.010040932680917),
+                                    ("Chhathyear (latent)", -5.604575824572753),
+                                    ("Vasant Panchamiyear (latent)", -6.010040932680917),
+                                    ("Palm Sundayintersect", -6.010040932680917),
+                                    ("<day-of-month> (ordinal or number) of <month>in|during the <part-of-day>",
+                                     -6.010040932680917),
+                                    ("Februaryintersect", -6.010040932680917),
+                                    ("Simchat Torahyear (latent)", -6.010040932680917)],
+                               n = 305},
+                   koData =
+                     ClassData{prior = -0.9982331033604875, unseen = -6.331501849893691,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<time-of-day> - <time-of-day> (interval)on <date>",
+                                     -5.636573724962751),
+                                    ("hourday", -5.636573724962751),
+                                    ("<named-month> <day-of-month> (non ordinal)July",
+                                     -5.636573724962751),
+                                    ("dayhour", -3.1942266895935467),
+                                    ("daymonth", -3.5571321832829152),
+                                    ("monthday", -5.231108616854587),
+                                    ("monthyear", -4.383810756467383),
+                                    ("<time-of-day> am|pmyear (latent)", -5.231108616854587),
+                                    ("Thai Pongalyear (latent)", -4.943426544402806),
+                                    ("intersecthh:mm", -5.636573724962751),
+                                    ("from <datetime> - <datetime> (interval)July",
+                                     -5.636573724962751),
+                                    ("houryear", -4.720282993088596),
+                                    ("from <time-of-day> - <time-of-day> (interval)July",
+                                     -5.636573724962751),
+                                    ("until <time-of-day><time-of-day> am|pm", -5.636573724962751),
+                                    ("<time-of-day> am|pmintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.943426544402806),
+                                    ("<time-of-day> am|pmintersect", -4.383810756467383),
+                                    ("Octoberyear (latent)", -5.636573724962751),
+                                    ("from|since|after <time-of-day>year (latent)",
+                                     -4.383810756467383),
+                                    ("from|since|after <time-of-day>on <date>", -4.720282993088596),
+                                    ("July<day-of-month> (ordinal or number) <named-month>",
+                                     -5.636573724962751),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -4.383810756467383),
+                                    ("about|exactly <time-of-day>year (latent)",
+                                     -5.636573724962751),
+                                    ("absorption of , after named dayJuly", -5.231108616854587),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.720282993088596),
+                                    ("Clean Mondayyear (latent)", -5.636573724962751),
+                                    ("monthhour", -5.636573724962751),
+                                    ("hourmonth", -4.943426544402806),
+                                    ("todayat <time-of-day>", -5.636573724962751),
+                                    ("from|since|after <time-of-day>July", -5.636573724962751),
+                                    ("Mondayyear (latent)", -4.943426544402806),
+                                    ("dayday", -5.231108616854587),
+                                    ("mm/ddat <time-of-day>", -5.231108616854587),
+                                    ("<time-of-day> am|pmon <date>", -4.383810756467383),
+                                    ("dayyear", -2.66615925939305),
+                                    ("Thursdaymm/dd", -5.636573724962751),
+                                    ("New Year's Dayyear (latent)", -5.231108616854587),
+                                    ("Thursdayat <time-of-day>", -4.383810756467383),
+                                    ("<integer> to|till|before <hour-of-day>September",
+                                     -5.636573724962751),
+                                    ("Aprilyear (latent)", -5.636573724962751),
+                                    ("monthminute", -5.636573724962751),
+                                    ("<time-of-day> am|pmtomorrow", -5.636573724962751),
+                                    ("Thursdayhh:mm", -4.720282993088596),
+                                    ("August<day-of-month> (ordinal or number) <named-month>",
+                                     -5.636573724962751),
+                                    ("minutemonth", -3.844814255734696),
+                                    ("Sundayfrom|since|after <time-of-day>", -5.636573724962751),
+                                    ("week-endin <named-month>|year", -5.636573724962751),
+                                    ("Augustyear (latent)", -5.231108616854587),
+                                    ("Thursdayfrom <datetime> - <datetime> (interval)",
+                                     -5.231108616854587),
+                                    ("Thursdayfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.231108616854587),
+                                    ("mm/dd<time-of-day> - <time-of-day> (interval)",
+                                     -5.231108616854587),
+                                    ("tomorrowfrom <time-of-day> - <time-of-day> (interval)",
+                                     -5.636573724962751),
+                                    ("Sundayyear (latent)", -4.943426544402806),
+                                    ("Christmasat <time-of-day>", -5.636573724962751),
+                                    ("<duration> after|before|from <time>December",
+                                     -5.636573724962751),
+                                    ("yesterday<time-of-day> am|pm", -5.636573724962751),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -4.720282993088596),
+                                    ("mm/ddyear (latent)", -5.636573724962751),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -5.231108616854587),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -5.636573724962751),
+                                    ("until <time-of-day>on <date>", -4.943426544402806),
+                                    ("at <time-of-day>intersect", -5.231108616854587),
+                                    ("hh:mmyear (latent)", -4.537961436294641),
+                                    ("Holiyear (latent)", -5.636573724962751),
+                                    ("at <time-of-day>intersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -5.636573724962751),
+                                    ("dayminute", -3.1516670751747506),
+                                    ("intersectSeptember", -4.132496328186477),
+                                    ("minuteday", -2.568520789829134),
+                                    ("absorption of , after named dayintersect",
+                                     -5.636573724962751),
+                                    ("Februaryin|during the <part-of-day>", -5.636573724962751),
+                                    ("hh:mmon <date>", -3.6216707044204863),
+                                    ("Saturdayyear (latent)", -5.636573724962751),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -5.636573724962751),
+                                    ("absorption of , after named daySeptember",
+                                     -4.720282993088596),
+                                    ("Naraka Chaturdashiyear (latent)", -5.636573724962751),
+                                    ("on <date>September", -5.231108616854587),
+                                    ("at <time-of-day>on <date>", -5.231108616854587),
+                                    ("in <named-month>|yearyear (latent)", -5.636573724962751),
+                                    ("dayweek", -5.636573724962751),
+                                    ("Easter Sundayyear (latent)", -5.231108616854587),
+                                    ("Thursday<time-of-day> am|pm", -5.231108616854587),
+                                    ("absorption of , after named dayFebruary", -4.720282993088596),
+                                    ("July<integer> to|till|before <hour-of-day>",
+                                     -5.636573724962751),
+                                    ("tomorrowat <time-of-day>", -5.636573724962751),
+                                    ("<integer> to|till|before <hour-of-day>July",
+                                     -5.636573724962751),
+                                    ("Thursdayfrom|since|after <time-of-day>", -4.027135812528651),
+                                    ("tomorrow<time-of-day> am|pm", -5.636573724962751),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -4.943426544402806),
+                                    ("Diwaliyear (latent)", -5.231108616854587),
+                                    ("Tuesdayfrom|since|after <time-of-day>", -5.636573724962751),
+                                    ("Fridayyear (latent)", -5.231108616854587),
+                                    ("minuteyear", -4.383810756467383)],
+                               n = 178}}),
+       ("one eleven",
+        Classifier{okData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("after lunch/work/school",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("early morning",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <number> (implicit minutes)",
+        Classifier{okData =
+                     ClassData{prior = -1.2685113254635072,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.3184537311185346),
+                                    ("integer (0..19)", -1.2992829841302609)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.33024168687057687,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.1743533871447778),
+                                    ("integer (0..19)", -1.8325814637483102)],
+                               n = 23}}),
+       ("<ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.791759469228055),
+                                    ("ordinal (digits)quarter (grain)year (latent)",
+                                     -2.1972245773362196),
+                                    ("quarteryear", -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)day (grain)October",
+                                     -2.1972245773362196),
+                                    ("ordinal (digits)day (grain)this|last|next <cycle>",
+                                     -2.1972245773362196),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)intersect",
+                                     -2.1972245773362196),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)week (grain)October",
+                                     -2.1972245773362196)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -1.0116009116784799,
+                               unseen = -3.6375861597263857,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -2.001480000210124),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("hh:mmhh:mm", -2.001480000210124),
+                                    ("dayday", -2.512305623976115),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)<day-of-month> (ordinal)",
+                                     -2.917770732084279),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.917770732084279),
+                                    ("hourhour", -2.512305623976115),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.917770732084279)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.45198512374305727,
+                               unseen = -3.912023005428146,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hourday", -3.1986731175506815),
+                                    ("dayhour", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)time-of-day (latent)",
+                                     -3.1986731175506815),
+                                    ("<named-month>|<named-day> <day-of-month> (ordinal)year (latent)",
+                                     -3.1986731175506815),
+                                    ("hh:mmtime-of-day (latent)", -2.2823823856765264),
+                                    ("minuteminute", -2.793208009442517),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.793208009442517),
+                                    ("dayday", -3.1986731175506815),
+                                    ("hourhour", -2.505525936990736),
+                                    ("dayyear", -3.1986731175506815),
+                                    ("minutehour", -2.2823823856765264),
+                                    ("hh:mmintersect", -2.793208009442517),
+                                    ("<day-of-month> (ordinal)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<time-of-day> am|pm",
+                                     -3.1986731175506815),
+                                    ("time-of-day (latent)<day-of-month> (ordinal or number) <named-month>",
+                                     -3.1986731175506815),
+                                    ("<named-month> <day-of-month> (non ordinal)time-of-day (latent)",
+                                     -3.1986731175506815)],
+                               n = 14}}),
+       ("Saturday",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.9459101490553135,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("the <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week (grain)<named-month>|<named-day> <day-of-month> (ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekmonth", -1.7346010553881064),
+                                    ("week (grain)October", -1.7346010553881064),
+                                    ("week (grain)<named-month> <day-of-month> (non ordinal)",
+                                     -1.7346010553881064),
+                                    ("weekday", -1.2237754316221157)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("number.number hours",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.6094379124341003),
+                                    ("hh:mmhh:mm", -1.6094379124341003),
+                                    ("<time-of-day> am|pmtime-of-day (latent)", -2.70805020110221),
+                                    ("hourhour", -2.3025850929940455),
+                                    ("hourminute", -2.3025850929940455),
+                                    ("time-of-day (latent)<time-of-day> sharp|exactly",
+                                     -2.70805020110221),
+                                    ("time-of-day (latent)hh:mm", -2.70805020110221),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.6094379124341003),
+                                    ("time-of-day (latent)time-of-day (latent)",
+                                     -2.0149030205422647),
+                                    ("hourhour", -1.791759469228055),
+                                    ("minutehour", -1.6094379124341003),
+                                    ("time-of-day (latent)<time-of-day> am|pm", -2.70805020110221)],
+                               n = 9}}),
+       ("integer 21..99",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)", -0.6931471805599453),
+                                    ("integer (20..90)integer (0..19)", -0.6931471805599453)],
+                               n = 4}}),
+       ("Tisha B'Av",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("yyyy-mm-dd",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("year (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.16454938704815686,
+                               unseen = -4.852030263919617,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -4.839654086185021e-2),
+                                    ("intersect 2 numbers", -3.457892725338701)],
+                               n = 123},
+                   koData =
+                     ClassData{prior = -1.8856912890622586, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.3121863889661687),
+                                    ("negative numbers", -0.6190392084062235),
+                                    ("compose by multiplication", -1.8718021769015913)],
+                               n = 22}}),
+       ("mm/dd/yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Monday",
+        Classifier{okData =
+                     ClassData{prior = -0.3483066942682157, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.2237754316221157,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("yesterday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<ordinal> quarter <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm:ss",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Hanukkah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<hour-of-day> <integer>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>integer (20..90)", -1.3862943611198906),
+                                    ("hour", -0.9808292530117262),
+                                    ("at <time-of-day>integer (numeric)", -1.3862943611198906)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>integer (numeric)",
+                                     -1.0986122886681098),
+                                    ("hour", -1.0986122886681098)],
+                               n = 1}}),
+       ("nth <time> of <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.9808292530117262),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -2.0794415416798357),
+                                    ("ordinals (first..twentieth,thirtieth,...)Wednesdayintersect",
+                                     -1.6739764335716716),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayOctober",
+                                     -1.6739764335716716)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -0.9808292530117262,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdaySeptember",
+                                     -1.791759469228055),
+                                    ("ordinals (first..twentieth,thirtieth,...)WednesdayOctober",
+                                     -1.3862943611198906)],
+                               n = 3}}),
+       ("Valentine's Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("April",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maha Saptami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week (grain)",
+        Classifier{okData =
+                     ClassData{prior = -4.0821994520255166e-2,
+                               unseen = -4.304065093204169,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 72},
+                   koData =
+                     ClassData{prior = -3.2188758248682006,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("<part-of-day> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("part of daysintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -2.3513752571634776),
+                                    ("part of daysintersect", -2.3513752571634776),
+                                    ("hourday", -0.9650808960435872),
+                                    ("part of daysthe <day-of-month> (ordinal)",
+                                     -2.3513752571634776),
+                                    ("part of daysthe <day-of-month> (number)",
+                                     -2.3513752571634776),
+                                    ("part of daysthis <time>", -2.3513752571634776),
+                                    ("part of daysChristmas", -1.9459101490553135)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("six thirty six a.m.",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -1.252762968495368),
+                                    ("one twenty two", -0.8472978603872037),
+                                    ("one eleven", -1.252762968495368)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Shrove Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("now",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("<day-of-month> (ordinal or number) of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.13353139262452263,
+                               unseen = -3.0910424533583156,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.3513752571634776),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.3513752571634776),
+                                    ("ordinal (digits)February", -2.3513752571634776),
+                                    ("integer (numeric)February", -1.9459101490553135),
+                                    ("month", -0.9650808960435872),
+                                    ("ordinal (digits)March", -2.3513752571634776),
+                                    ("integer (numeric)July", -2.3513752571634776)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -2.0794415416798357,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.5040773967762742),
+                                    ("month", -1.5040773967762742)],
+                               n = 1}}),
+       ("this <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.6931471805599453),
+                                    ("part of days", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Kaanum Pongal",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Yom Kippur",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("powers of tens",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Friday",
+        Classifier{okData =
+                     ClassData{prior = -0.3677247801253174,
+                               unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                   koData =
+                     ClassData{prior = -1.1786549963416462, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("in|during the <part-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -8.701137698962981e-2,
+                               unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("early morning", -2.5257286443082556),
+                                    ("hour", -0.7339691750802004),
+                                    ("part of days", -0.8209805520698302)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -2.4849066497880004, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour", -0.916290731874155),
+                                    ("part of days", -0.916290731874155)],
+                               n = 1}}),
+       ("tomorrow",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh(:mm) - <time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|last|next <cycle>",
+        Classifier{okData =
+                     ClassData{prior = -7.598590697792199e-2,
+                               unseen = -5.093750200806762,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.1173044216802621),
+                                    ("month (grain)", -2.7850112422383386),
+                                    ("year (grain)", -2.6026896854443837),
+                                    ("week (grain)", -1.1173044216802621),
+                                    ("quarter", -3.4781584227982836), ("year", -2.6026896854443837),
+                                    ("month", -2.7850112422383386),
+                                    ("quarter (grain)", -3.4781584227982836)],
+                               n = 76},
+                   koData =
+                     ClassData{prior = -2.6149597780361984,
+                               unseen = -3.1354942159291497,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.4816045409242156),
+                                    ("week (grain)", -1.4816045409242156),
+                                    ("day", -1.9924301646902063),
+                                    ("day (grain)", -1.9924301646902063)],
+                               n = 6}}),
+       ("Simchat Torah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Eve",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)year (latent)",
+                                     -0.6931471805599453),
+                                    ("quarteryear", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Raksha Bandhan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Ashura",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Palm Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Adha",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("noon|midnight|EOD|end of day", -1.9459101490553135),
+                                    ("time-of-day (latent)", -1.9459101490553135),
+                                    ("<time-of-day> am|pm", -1.9459101490553135),
+                                    ("hh:mm", -1.9459101490553135), ("hour", -1.540445040947149),
+                                    ("minute", -1.540445040947149)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("half an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2006706954621511,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinals (first..twentieth,thirtieth,...)",
+                                     -1.7047480922384253),
+                                    ("ordinal (digits)", -0.2006706954621511)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.7047480922384253,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("ordinal (digits)", -0.2876820724517809)],
+                               n = 2}}),
+       ("last weekend of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -0.9555114450274363), ("July", -1.8718021769015913),
+                                    ("month", -0.7731898882334817)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <day-of-month> (number)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lag BaOmer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("fractional number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17}}),
+       ("Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.262364264467491, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -1.466337068793427, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Chinese New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("February",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.70805020110221,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 13},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("minute (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 15},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last|this|next <season>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <ordinal> quarter",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)quarter (grain)", -0.6931471805599453),
+                                    ("quarter", -0.6931471805599453)],
+                               n = 1}}),
+       ("time-of-day (latent)",
+        Classifier{okData =
+                     ClassData{prior = -0.5699145401359973, unseen = -4.290459441148391,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -0.11778303565638351),
+                                    ("integer (0..19)", -2.330755969960742)],
+                               n = 69},
+                   koData =
+                     ClassData{prior = -0.8337291311811348, unseen = -4.04305126783455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -9.352605801082348e-2),
+                                    ("integer (0..19)", -2.9267394020670396),
+                                    ("integer 21..99", -3.332204510175204)],
+                               n = 53}}),
+       ("beginning of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("last <day-of-week> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -0.916290731874155),
+                                    ("SundayMarch", -1.6094379124341003),
+                                    ("MondayMarch", -1.6094379124341003),
+                                    ("Sundayintersect", -1.6094379124341003)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.13036181786324358,
+                               unseen = -5.204006687076795,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.5594397016505672),
+                                    ("integer (0..19)year (grain)", -3.11905548958599),
+                                    ("integer (numeric)day (grain)", -2.8006017584674554),
+                                    ("integer (0..19)second (grain) ", -3.8122026701459353),
+                                    ("integer (0..19)hour (grain)", -3.11905548958599),
+                                    ("second", -3.4067375620377707),
+                                    ("integer (numeric)second (grain) ", -4.099884742597716),
+                                    ("integer (numeric)year (grain)", -3.11905548958599),
+                                    ("day", -2.4904468301636156), ("year", -2.4904468301636156),
+                                    ("integer (numeric)week (grain)", -3.11905548958599),
+                                    ("integer (0..19)month (grain)", -3.5890591188317256),
+                                    ("hour", -2.7135903814778253), ("month", -2.89591193827178),
+                                    ("integer (numeric)minute (grain)", -3.2525868822105126),
+                                    ("integer (0..19)minute (grain)", -3.11905548958599),
+                                    ("integer (numeric)month (grain)", -3.4067375620377707),
+                                    ("minute", -2.5594397016505672),
+                                    ("integer (numeric)hour (grain)", -3.5890591188317256),
+                                    ("integer (0..19)day (grain)", -3.5890591188317256),
+                                    ("integer (0..19)week (grain)", -3.2525868822105126)],
+                               n = 79},
+                   koData =
+                     ClassData{prior = -2.1019143975318944, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("quarter", -3.1135153092103742), ("hour", -1.4087672169719492),
+                                    ("integer (numeric)hour (grain)", -1.4087672169719492),
+                                    ("integer (0..19)quarter (grain)", -3.1135153092103742)],
+                               n = 11}}),
+       ("hhmm (latent)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> am|pm",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -5.342334251964811,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer after|past <hour-of-day>", -3.951243718581427),
+                                    ("at <time-of-day>", -2.202043863772168),
+                                    ("from|since|after <time-of-day>", -3.7281001672672174),
+                                    ("<time-of-day> o'clock", -4.238925791033208),
+                                    ("half after|past <hour-of-day>", -4.238925791033208),
+                                    ("time-of-day (latent)", -1.7266201670570935),
+                                    ("hhmm (latent)", -4.6443908991413725),
+                                    ("hh:mm", -2.293015641977895),
+                                    ("quarter after|past <hour-of-day>", -4.6443908991413725),
+                                    ("about|exactly <time-of-day>", -4.6443908991413725),
+                                    ("until <time-of-day>", -3.951243718581427),
+                                    ("hour", -1.2104036946562264),
+                                    ("<time-of-day> sharp|exactly", -4.6443908991413725),
+                                    ("minute", -1.754019141245208)],
+                               n = 96},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -4.394449154672439,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> to|till|before <hour-of-day>", -3.283414346005772),
+                                    ("from|since|after <time-of-day>", -3.283414346005772),
+                                    ("<hour-of-day> <integer>", -3.6888794541139363),
+                                    ("time-of-day (latent)", -1.0498221244986778),
+                                    ("hour", -1.0147308046874075), ("minute", -2.772588722239781)],
+                               n = 32}}),
+       ("Yom Ha'atzmaut",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("from <day-of-month> (ordinal or number) to <day-of-month> (ordinal or number) <named-month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)ordinal (digits)July", -1.252762968495368),
+                                    ("integer (numeric)integer (numeric)July", -1.252762968495368),
+                                    ("month", -0.8472978603872037)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thiru Onam",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thai Pongal",
+        Classifier{okData =
+                     ClassData{prior = -0.5596157879354228, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Vijayadashami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Thanksgiving Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 17},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("March", -0.6931471805599453), ("month", -0.6931471805599453)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("a <unit-of-duration>",
+        Classifier{okData =
+                     ClassData{prior = -0.49247648509779407,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -2.1972245773362196),
+                                    ("year (grain)", -2.1972245773362196),
+                                    ("second", -2.890371757896165),
+                                    ("week (grain)", -2.1972245773362196),
+                                    ("day", -2.1972245773362196),
+                                    ("minute (grain)", -2.890371757896165),
+                                    ("year", -2.1972245773362196),
+                                    ("second (grain) ", -2.890371757896165),
+                                    ("minute", -2.890371757896165),
+                                    ("day (grain)", -2.1972245773362196)],
+                               n = 11},
+                   koData =
+                     ClassData{prior = -0.9444616088408514, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hour (grain)", -1.7227665977411035),
+                                    ("quarter", -1.9459101490553135), ("hour", -1.7227665977411035),
+                                    ("quarter (grain)", -1.9459101490553135)],
+                               n = 7}}),
+       ("at the beginning|end of <year>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("year (latent)", -0.6931471805599453),
+                                    ("year", -0.6931471805599453)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Dhanteras",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Tu BiShvat",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Whit Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hh:mm",
+        Classifier{okData =
+                     ClassData{prior = -5.6352936551131744e-2,
+                               unseen = -4.2626798770413155,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 69},
+                   koData =
+                     ClassData{prior = -2.9041650800285006, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("Holi",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Rosh Hashanah",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Holika Dahan",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter of an hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("second (grain) ",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinals (first..twentieth,thirtieth,...)",
+        Classifier{okData =
+                     ClassData{prior = -6.899287148695143e-2,
+                               unseen = -2.772588722239781,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 14},
+                   koData =
+                     ClassData{prior = -2.70805020110221, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("Mawlid",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Jumu'atul-Wida",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter after|past <hour-of-day>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -0.6931471805599453),
+                                    ("hour", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("the <cycle> after|before <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)tomorrow", -1.252762968495368),
+                                    ("dayday", -0.8472978603872037),
+                                    ("day (grain)yesterday", -1.252762968495368)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("about|exactly <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.15415067982725836,
+                               unseen = -3.6109179126442243,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -1.791759469228055),
+                                    ("hh(:mm) - <time-of-day> am|pm", -2.890371757896165),
+                                    ("this|last|next <cycle>", -1.791759469228055),
+                                    ("day", -2.4849066497880004),
+                                    ("time-of-day (latent)", -2.890371757896165),
+                                    ("hhmm (latent)", -2.4849066497880004),
+                                    ("<time-of-day> am|pm", -2.890371757896165),
+                                    ("hour", -2.1972245773362196),
+                                    ("next <time>", -2.890371757896165),
+                                    ("this|next <day-of-week>", -2.890371757896165),
+                                    ("minute", -2.4849066497880004)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -1.9459101490553135, unseen = -2.833213344056216,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("mm/dd", -2.0794415416798357), ("day", -2.0794415416798357),
+                                    ("time-of-day (latent)", -2.0794415416798357),
+                                    ("hour", -2.0794415416798357)],
+                               n = 2}}),
+       ("Sukkot",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day> in <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("daymonth", -2.3025850929940455),
+                                    ("monthyear", -1.8971199848858813),
+                                    ("Marcha <unit-of-duration>", -2.3025850929940455),
+                                    ("March<integer> <unit-of-duration>", -2.3025850929940455),
+                                    ("Thanksgiving Daya <unit-of-duration>", -2.3025850929940455),
+                                    ("Thanksgiving Day<integer> <unit-of-duration>",
+                                     -1.8971199848858813),
+                                    ("Vijayadashami<integer> <unit-of-duration>",
+                                     -2.3025850929940455),
+                                    ("dayyear", -1.6094379124341003)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("World Vegan Day",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("intersect by \",\", \"of\", \"from\", \"'s\"",
+        Classifier{okData =
+                     ClassData{prior = -0.4700036292457356, unseen = -5.081404364984463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday<named-month> <day-of-month> (non ordinal)",
+                                     -4.382026634673881),
+                                    ("dayhour", -3.1292636661785136),
+                                    ("daymonth", -3.1292636661785136),
+                                    ("<named-month> <day-of-month> (non ordinal)Friday",
+                                     -4.382026634673881),
+                                    ("Friday<named-month> <day-of-month> (non ordinal)",
+                                     -3.6888794541139363),
+                                    ("Wednesdayintersect", -4.382026634673881),
+                                    ("Black Fridaythis|last|next <cycle>", -4.382026634673881),
+                                    ("<part-of-day> of <time>February", -4.382026634673881),
+                                    ("Saturday<time-of-day> am|pm", -4.382026634673881),
+                                    ("Martin Luther King's Daythis|last|next <cycle>",
+                                     -3.9765615265657175),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"year (latent)",
+                                     -4.382026634673881),
+                                    ("on <date><time-of-day> am|pm", -4.382026634673881),
+                                    ("hourmonth", -4.382026634673881),
+                                    ("dayday", -2.5102244577722903),
+                                    ("the <day-of-month> (ordinal)February", -3.9765615265657175),
+                                    ("WednesdayOctober", -4.382026634673881),
+                                    ("Wednesdaythis|last|next <cycle>", -3.9765615265657175),
+                                    ("intersect<named-month> <day-of-month> (non ordinal)",
+                                     -3.4657359027997265),
+                                    ("dayyear", -2.8779492378976075),
+                                    ("Saturday<named-month> <day-of-month> (non ordinal)",
+                                     -4.382026634673881),
+                                    ("Thursdayhh:mm", -3.9765615265657175),
+                                    ("Thanksgiving Daythis|last|next <cycle>", -4.382026634673881),
+                                    ("on <date><named-month> <day-of-month> (non ordinal)",
+                                     -3.9765615265657175),
+                                    ("TuesdayOctober", -4.382026634673881),
+                                    ("the <day-of-month> (ordinal)March", -4.382026634673881),
+                                    ("Mondaythis|last|next <cycle>", -4.382026634673881),
+                                    ("Fridayintersect by \",\", \"of\", \"from\", \"'s\"",
+                                     -4.382026634673881),
+                                    ("Fridayintersect", -4.382026634673881),
+                                    ("Thursday<datetime> - <datetime> (interval)",
+                                     -3.6888794541139363),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.4657359027997265),
+                                    ("Tuesdaythis|last|next <cycle>", -4.382026634673881),
+                                    ("Sunday<named-month> <day-of-month> (non ordinal)",
+                                     -4.382026634673881),
+                                    ("dayminute", -2.995732273553991),
+                                    ("minuteday", -3.4657359027997265),
+                                    ("this|last|next <cycle>Sunday", -4.382026634673881),
+                                    ("intersectyear (latent)", -4.382026634673881),
+                                    ("Sundaythis|last|next <cycle>", -4.382026634673881),
+                                    ("weekday", -4.382026634673881),
+                                    ("dayweek", -3.283414346005772),
+                                    ("Thursday<time-of-day> am|pm", -4.382026634673881),
+                                    ("Monday<named-month> <day-of-month> (non ordinal)",
+                                     -3.9765615265657175),
+                                    ("<named-month> <day-of-month> (non ordinal)year (latent)",
+                                     -3.9765615265657175)],
+                               n = 50},
+                   koData =
+                     ClassData{prior = -0.9808292530117262, unseen = -4.795790545596741,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week-endJuly", -4.0943445622221),
+                                    ("week-endOctober", -3.4011973816621555),
+                                    ("daymonth", -1.8971199848858813),
+                                    ("TuesdaySeptember", -4.0943445622221),
+                                    ("Wednesdayintersect", -4.0943445622221),
+                                    ("hourmonth", -2.995732273553991),
+                                    ("Fridaythis|last|next <cycle>", -4.0943445622221),
+                                    ("SundayFebruary", -4.0943445622221),
+                                    ("WednesdayOctober", -4.0943445622221),
+                                    ("week-endintersect", -4.0943445622221),
+                                    ("dayyear", -4.0943445622221),
+                                    ("FridayJuly", -3.6888794541139363),
+                                    ("FridaySeptember", -4.0943445622221),
+                                    ("WednesdayFebruary", -4.0943445622221),
+                                    ("minutemonth", -3.1780538303479458),
+                                    ("SundayMarch", -4.0943445622221),
+                                    ("MondayFebruary", -3.6888794541139363),
+                                    ("Fridayintersect", -4.0943445622221),
+                                    ("Thursday<time-of-day> - <time-of-day> (interval)",
+                                     -3.6888794541139363),
+                                    ("dayminute", -3.4011973816621555),
+                                    ("SaturdaySeptember", -4.0943445622221),
+                                    ("intersectSeptember", -3.1780538303479458),
+                                    ("MondayMarch", -4.0943445622221),
+                                    ("on <date>September", -3.6888794541139363),
+                                    ("Tuesdayintersect", -4.0943445622221),
+                                    ("Sundayintersect", -4.0943445622221)],
+                               n = 30}}),
+       ("last <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6286086594223742, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.5649493574615367),
+                                    ("day", -1.1786549963416462), ("Sunday", -2.5649493574615367),
+                                    ("Chinese New Year", -2.159484249353372),
+                                    ("Thanksgiving Day", -2.5649493574615367),
+                                    ("Easter Sunday", -2.5649493574615367),
+                                    ("hour", -2.5649493574615367), ("Tuesday", -2.5649493574615367),
+                                    ("week-end", -2.5649493574615367)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -0.7621400520468967,
+                               unseen = -3.2188758248682006,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Monday", -2.4849066497880004), ("day", -2.0794415416798357),
+                                    ("Sunday", -2.4849066497880004), ("hour", -1.3862943611198906),
+                                    ("week-end", -1.3862943611198906)],
+                               n = 7}}),
+       ("March",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.044522437723423,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 19},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<named-month>|<named-day> <day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097, unseen = -3.258096538021482,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Octoberordinal (digits)", -2.120263536200091),
+                                    ("Thursdayordinal (digits)", -2.5257286443082556),
+                                    ("day", -2.120263536200091),
+                                    ("Augustordinal (digits)", -2.5257286443082556),
+                                    ("Marchordinals (first..twentieth,thirtieth,...)",
+                                     -2.120263536200091),
+                                    ("Tuesdayordinal (digits)", -2.5257286443082556),
+                                    ("month", -1.2729656758128873),
+                                    ("Marchordinal (digits)", -2.5257286443082556)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.6094379124341003, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("from|since|after <time-of-day>ordinal (digits)",
+                                     -1.8718021769015913),
+                                    ("Augustordinal (digits)", -1.8718021769015913),
+                                    ("month", -1.466337068793427)],
+                               n = 2}}),
+       ("Clean Monday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month> (ordinal)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("ordinal (digits)", 0.0)], n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Easter Sunday",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
+       ("Christmas",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("until <time-of-day>",
+        Classifier{okData =
+                     ClassData{prior = -0.9808292530117262, unseen = -3.044522437723423,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("time-of-day (latent)", -2.3025850929940455),
+                                    ("<time-of-day> am|pm", -1.6094379124341003),
+                                    ("hh:mm", -1.8971199848858813), ("hour", -1.8971199848858813),
+                                    ("minute", -1.3862943611198906)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -0.4700036292457356, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersect", -1.7227665977411035),
+                                    ("yesterday", -2.2335922215070942),
+                                    ("day", -2.2335922215070942), ("hh:mm", -1.7227665977411035),
+                                    ("hour", -2.639057329615259), ("minute", -1.252762968495368)],
+                               n = 10}}),
+       ("mm.dd.yyyy",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Isra and Mi'raj",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<duration> after|before|from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.5553480614894135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("a <unit-of-duration>now", -2.833213344056216),
+                                    ("a <unit-of-duration>Christmas", -2.833213344056216),
+                                    ("dayday", -2.833213344056216),
+                                    ("<integer> <unit-of-duration>today", -2.833213344056216),
+                                    ("daysecond", -2.833213344056216),
+                                    ("a <unit-of-duration>right now", -2.833213344056216),
+                                    ("minutenograin", -2.833213344056216),
+                                    ("<integer> <unit-of-duration>Christmas", -2.833213344056216),
+                                    ("<integer> <unit-of-duration>Easter Sunday",
+                                     -2.833213344056216),
+                                    ("secondnograin", -2.833213344056216),
+                                    ("yearday", -2.1400661634962708),
+                                    ("daynograin", -2.833213344056216),
+                                    ("<integer> <unit-of-duration>now", -2.4277482359480516)],
+                               n = 8},
+                   koData =
+                     ClassData{prior = -1.0986122886681098, unseen = -3.295836866004329,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -2.5649493574615367),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -2.5649493574615367),
+                                    ("monthnograin", -2.5649493574615367),
+                                    ("dayday", -2.159484249353372),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -2.5649493574615367),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -2.5649493574615367),
+                                    ("<integer> <unit-of-duration>now", -2.5649493574615367)],
+                               n = 4}}),
+       ("<day-of-month> (ordinal or number) of <month>",
+        Classifier{okData =
+                     ClassData{prior = -8.004270767353637e-2,
+                               unseen = -3.5263605246161616,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)July", -2.803360380906535),
+                                    ("ordinals (first..twentieth,thirtieth,...)March",
+                                     -2.803360380906535),
+                                    ("ordinal (digits)this|last|next <cycle>", -2.1102132003465894),
+                                    ("integer (numeric)this|last|next <cycle>",
+                                     -2.3978952727983707),
+                                    ("ordinal (digits)February", -2.803360380906535),
+                                    ("integer (numeric)February", -2.3978952727983707),
+                                    ("month", -0.9315582040049435),
+                                    ("ordinal (digits)March", -2.803360380906535),
+                                    ("integer (numeric)July", -2.803360380906535)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -2.5649493574615367,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)February", -1.7047480922384253),
+                                    ("month", -1.7047480922384253)],
+                               n = 1}}),
+       ("decimal number",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3}}),
+       ("Naraka Chaturdashi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("beginning of month",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("next <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Martin Luther King's Day", -2.70805020110221),
+                                    ("Halloween", -2.70805020110221),
+                                    ("Wednesday", -2.70805020110221),
+                                    ("Boss's Day", -2.70805020110221),
+                                    ("Monday", -2.70805020110221), ("day", -1.0986122886681098),
+                                    ("Thanksgiving Day", -2.70805020110221),
+                                    ("March", -2.70805020110221), ("month", -2.70805020110221),
+                                    ("Tuesday", -2.0149030205422647)],
+                               n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time-of-day> sharp|exactly",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.890371757896165,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("at <time-of-day>", -2.1400661634962708),
+                                    ("time-of-day (latent)", -2.1400661634962708),
+                                    ("hhmm (latent)", -2.1400661634962708),
+                                    ("<time-of-day> am|pm", -2.1400661634962708),
+                                    ("hh:mm", -2.1400661634962708), ("hour", -1.7346010553881064),
+                                    ("minute", -1.4469189829363254)],
+                               n = 5},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("in <named-month>|year",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -2.4423470353692043),
+                                    ("year (latent)", -1.0560526742493137),
+                                    ("year", -1.0560526742493137), ("March", -2.4423470353692043),
+                                    ("month", -2.03688192726104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -2.4849066497880004,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.2992829841302609),
+                                    ("year (latent)", -1.7047480922384253),
+                                    ("year", -1.7047480922384253), ("month", -1.2992829841302609)],
+                               n = 3}}),
+       ("Islamic New Year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("negative numbers",
+        Classifier{okData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0},
+                   koData =
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)", -7.696104113612832e-2),
+                                    ("integer (0..19)", -2.6026896854443837)],
+                               n = 25}}),
+       ("about|exactly <duration>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("half an hour", -0.6931471805599453),
+                                    ("minute", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> before last|after next",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Wednesday", -1.8718021769015913),
+                                    ("Friday", -1.466337068793427), ("day", -1.1786549963416462),
+                                    ("March", -1.8718021769015913), ("month", -1.8718021769015913)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("by the end of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("this|last|next <cycle>", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("hhmm (military) am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<datetime> - <datetime> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.3794896217049037, unseen = -4.304065093204169,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("intersecthh:mm", -3.1918471524802814),
+                                    ("intersect<time-of-day> am|pm", -3.1918471524802814),
+                                    ("minuteminute", -1.457246097092175),
+                                    ("hh:mmhh:mm", -2.093234863812172),
+                                    ("dayday", -3.1918471524802814),
+                                    ("hourhour", -2.093234863812172),
+                                    ("<named-month> <day-of-month> (non ordinal)<named-month> <day-of-month> (non ordinal)",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"hh:mm",
+                                     -3.1918471524802814),
+                                    ("intersect by \",\", \"of\", \"from\", \"'s\"<time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.597312260588446),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.681021528714291),
+                                    ("from|since|after <time-of-day>hh:mm", -2.681021528714291)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -1.1526795099383855, unseen = -3.828641396489095,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<named-month> <day-of-month> (non ordinal)July",
+                                     -3.1135153092103742),
+                                    ("daymonth", -2.70805020110221),
+                                    ("from|since|after <time-of-day>intersect", -2.70805020110221),
+                                    ("<time-of-day> am|pmintersect", -3.1135153092103742),
+                                    ("hh:mm<time-of-day> am|pm", -2.70805020110221),
+                                    ("minuteminute", -1.8607523407150064),
+                                    ("hourhour", -2.70805020110221),
+                                    ("minutehour", -2.70805020110221),
+                                    ("hh:mmintersect", -2.1972245773362196),
+                                    ("<named-month> <day-of-month> (non ordinal)August",
+                                     -3.1135153092103742),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.1135153092103742)],
+                               n = 12}}),
+       ("Tuesday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("New Year's Day",
+        Classifier{okData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.3025850929940455,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 8}}),
+       ("fortnight",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<integer> and an half hour",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("integer (numeric)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Laylat al-Qadr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Boghi",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("at the beginning|end of <named-month>",
+        Classifier{okData =
+                     ClassData{prior = -0.2231435513142097,
+                               unseen = -2.5649493574615367,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("January", -1.3862943611198906),
+                                    ("April", -1.3862943611198906), ("month", -0.8754687373538999)],
+                               n = 4},
+                   koData =
+                     ClassData{prior = -1.6094379124341003,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("October", -1.0986122886681098),
+                                    ("month", -1.0986122886681098)],
+                               n = 1}}),
+       ("<time-of-day> - <time-of-day> (interval)",
+        Classifier{okData =
+                     ClassData{prior = -0.7375989431307791, unseen = -4.110873864173311,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -1.529395204760564),
+                                    ("hh:mmhh:mm", -1.8971199848858813),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -2.4849066497880004),
+                                    ("hourhour", -1.6964492894237302),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -3.4011973816621555),
+                                    ("from|since|after <time-of-day><time-of-day> am|pm",
+                                     -3.4011973816621555),
+                                    ("<time-of-day> am|pm<time-of-day> am|pm", -2.4849066497880004),
+                                    ("from|since|after <time-of-day>hh:mm", -2.4849066497880004)],
+                               n = 22},
+                   koData =
+                     ClassData{prior = -0.6505875661411494, unseen = -4.174387269895637,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("about|exactly <time-of-day>time-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("hh:mmtime-of-day (latent)", -1.7609878105613013),
+                                    ("hh:mm<time-of-day> am|pm", -3.0602707946915624),
+                                    ("<time-of-day> am|pmtime-of-day (latent)",
+                                     -3.4657359027997265),
+                                    ("at <time-of-day><time-of-day> am|pm", -3.4657359027997265),
+                                    ("hourhour", -2.2129729343043585),
+                                    ("minutehour", -1.2144441041932315),
+                                    ("about|exactly <time-of-day><time-of-day> am|pm",
+                                     -3.4657359027997265),
+                                    ("from|since|after <time-of-day>time-of-day (latent)",
+                                     -2.5494451709255714),
+                                    ("at <time-of-day>time-of-day (latent)", -3.0602707946915624),
+                                    ("<integer> to|till|before <hour-of-day>time-of-day (latent)",
+                                     -3.0602707946915624)],
+                               n = 24}}),
+       ("military spelled out numbers am|pm",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)integer (20..90)", 0.0)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("winter",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("nth <time> after <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)Tuesdayintersect",
+                                     -0.916290731874155)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..twentieth,thirtieth,...)TuesdayChristmas",
+                                     -0.916290731874155)],
+                               n = 1}}),
+       ("<named-month> <day-of-month> (non ordinal)",
+        Classifier{okData =
+                     ClassData{prior = -0.42121346507630353,
+                               unseen = -3.951243718581427,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.5455312716044354),
+                                    ("Marchinteger (numeric)", -2.833213344056216),
+                                    ("Aprilinteger (numeric)", -3.2386784521643803),
+                                    ("month", -0.8407831793660099),
+                                    ("Februaryinteger (numeric)", -1.9859154836690123),
+                                    ("Septemberinteger (numeric)", -2.833213344056216),
+                                    ("Octoberinteger (numeric)", -2.833213344056216),
+                                    ("Julyinteger (numeric)", -2.1400661634962708)],
+                               n = 21},
+                   koData =
+                     ClassData{prior = -1.067840630001356, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Augustinteger (numeric)", -2.3353749158170367),
+                                    ("Marchinteger (numeric)", -2.740840023925201),
+                                    ("Aprilinteger (numeric)", -2.740840023925201),
+                                    ("month", -0.9490805546971459),
+                                    ("from|since|after <time-of-day>integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("Julyinteger (numeric)", -1.6422277352570913)],
+                               n = 11}}),
+       ("Diwali",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809,
+                               unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -1.3862943611198906,
+                               unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("last night",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this|next <day-of-week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.2512917986064953),
+                                    ("Wednesday", -2.2512917986064953),
+                                    ("Monday", -1.845826690498331), ("day", -0.8649974374866046),
+                                    ("Tuesday", -1.55814461804655)],
+                               n = 7},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("ordinal (digits)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.6635616461296463,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 37},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("quarter (grain)",
+        Classifier{okData =
+                     ClassData{prior = -0.2876820724517809, unseen = -2.639057329615259,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 12},
+                   koData =
+                     ClassData{prior = -1.3862943611198906, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4}}),
+       ("last <cycle> of <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("day (grain)October", -1.791759469228055),
+                                    ("daymonth", -1.2809338454620642),
+                                    ("day (grain)intersect", -1.791759469228055),
+                                    ("weekmonth", -1.791759469228055),
+                                    ("week (grain)intersect", -2.1972245773362196),
+                                    ("week (grain)September", -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Chhath",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Vasant Panchami",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<day-of-month>(ordinal) <named-month> year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("ordinal (digits)April", -0.6931471805599453),
+                                    ("month", -0.6931471805599453)],
+                               n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Black Friday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("week-end",
+        Classifier{okData =
+                     ClassData{prior = -1.252762968495368, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -0.3364722366212129,
+                               unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 5}}),
+       ("Great Lent",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Maundy Thursday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("day (grain)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.295836866004329,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 25},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("right now",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("for <duration> from <time>",
+        Classifier{okData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -2.3025850929940455,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("<integer> <unit-of-duration><day-of-month> (ordinal)",
+                                     -1.5040773967762742),
+                                    ("dayday", -1.0986122886681098),
+                                    ("<integer> <unit-of-duration><day-of-month> (ordinal or number) <named-month>",
+                                     -1.5040773967762742)],
+                               n = 2},
+                   koData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -2.0794415416798357,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("dayhour", -1.252762968495368),
+                                    ("<integer> <unit-of-duration>time-of-day (latent)",
+                                     -1.252762968495368)],
+                               n = 1}}),
+       ("compose by multiplication",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..19)powers of tens", 0.0)],
+                               n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("end of year",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.4849066497880004,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 10},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("between <time> and <time>",
+        Classifier{okData =
+                     ClassData{prior = -1.0986122886681098,
+                               unseen = -3.1780538303479458,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("minuteminute", -0.832909122935104),
+                                    ("hh:mmhh:mm", -0.832909122935104)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -0.40546510810816444,
+                               unseen = -3.7376696182833684,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("hh:mmtime-of-day (latent)", -1.410986973710262),
+                                    ("minuteminute", -1.410986973710262),
+                                    ("minutehour", -1.410986973710262),
+                                    ("hh:mmintersect", -1.410986973710262)],
+                               n = 18}}),
+       ("<month> dd-dd (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4657359027997265,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Julyinteger (numeric)integer (numeric)", -1.6422277352570913),
+                                    ("from|since|after <time-of-day>ordinal (digits)ordinal (digits)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>integer (numeric)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("from|since|after <time-of-day>ordinal (digits)integer (numeric)",
+                                     -2.740840023925201),
+                                    ("Augustordinal (digits)integer (numeric)",
+                                     -2.3353749158170367),
+                                    ("month", -0.8690378470236094),
+                                    ("Augustordinal (digits)ordinal (digits)",
+                                     -2.3353749158170367)],
+                               n = 12},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.0794415416798357,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("part of days",
+        Classifier{okData =
+                     ClassData{prior = -3.509131981127006e-2,
+                               unseen = -3.4011973816621555,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 28},
+                   koData =
+                     ClassData{prior = -3.367295829986474, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+       ("at the beginning|end of <week>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -4.330733340286331,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("week", -0.706570200892086),
+                                    ("this|last|next <cycle>", -0.8209805520698302),
+                                    ("about|exactly <time-of-day>", -2.70805020110221)],
+                               n = 36},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Eid al-Fitr",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("summer",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Trinity Sunday",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("dd-dd <month> (interval)",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -2.9444389791664407,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("integer (numeric)integer (numeric)September",
+                                     -1.791759469228055),
+                                    ("ordinal (digits)ordinal (digits)July", -2.1972245773362196),
+                                    ("ordinal (digits)ordinal (digits)October",
+                                     -2.1972245773362196),
+                                    ("integer (numeric)integer (numeric)July", -2.1972245773362196),
+                                    ("month", -0.9444616088408514),
+                                    ("ordinal (digits)ordinal (digits)August",
+                                     -2.1972245773362196)],
+                               n = 6},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("Pentecost",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("this <time>",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("Thursday", -2.639057329615259),
+                                    ("Martin Luther King's Day", -2.639057329615259),
+                                    ("Monday", -2.639057329615259), ("day", -1.1349799328389845),
+                                    ("Thanksgiving Day", -2.639057329615259),
+                                    ("Christmas", -2.639057329615259), ("hour", -2.639057329615259),
+                                    ("winter", -2.639057329615259),
+                                    ("week-end", -2.639057329615259),
+                                    ("summer", -2.2335922215070942)],
+                               n = 9},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("August",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/ES_XX.hs b/Duckling/Ranking/Classifiers/ES_XX.hs
--- a/Duckling/Ranking/Classifiers/ES_XX.hs
+++ b/Duckling/Ranking/Classifiers/ES_XX.hs
@@ -454,13 +454,6 @@
                                     ("<hour-of-day> and <relative minutes>", -1.791759469228055),
                                     ("hour", -1.791759469228055), ("minute", -1.791759469228055)],
                                n = 4}}),
-       ("season",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("minutos (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -620,6 +613,13 @@
                    koData =
                      ClassData{prior = 0.0, unseen = -2.639057329615259,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 12}}),
+       ("invierno",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <part-of-day>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -701,6 +701,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("verano",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("number (20..90)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.791759469228055,
@@ -1243,13 +1250,14 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ce <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.772588722239781,
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
                                likelihoods =
                                  HashMap.fromList
-                                   [("season", -1.6094379124341003), ("Lunes", -2.0149030205422647),
-                                    ("day", -1.3217558399823195), ("hour", -1.6094379124341003),
-                                    ("week-end", -1.6094379124341003)],
+                                   [("invierno", -2.0794415416798357),
+                                    ("Lunes", -2.0794415416798357), ("verano", -2.0794415416798357),
+                                    ("day", -1.3862943611198906), ("hour", -1.6739764335716716),
+                                    ("week-end", -1.6739764335716716)],
                                n = 5},
                    koData =
-                     ClassData{prior = -infinity, unseen = -1.791759469228055,
+                     ClassData{prior = -infinity, unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [], n = 0}})]
diff --git a/Duckling/Ranking/Classifiers/NL_XX.hs b/Duckling/Ranking/Classifiers/NL_XX.hs
--- a/Duckling/Ranking/Classifiers/NL_XX.hs
+++ b/Duckling/Ranking/Classifiers/NL_XX.hs
@@ -21,8 +21,15 @@
 classifiers :: Classifiers
 classifiers
   = HashMap.fromList
-      [("<time> timezone",
+      [("Kerstmis",
         Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<time> timezone",
+        Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3978952727983707,
                                likelihoods =
                                  HashMap.fromList
@@ -65,13 +72,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("Father's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("thursday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.4849066497880004,
@@ -249,6 +249,13 @@
                                    [("hh:mmtime-of-day (latent)", -1.0986122886681098),
                                     ("minutehour", -1.0986122886681098)],
                                n = 1}}),
+       ("Halloween",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("between <datetime> and <datetime> (interval)",
         Classifier{okData =
                      ClassData{prior = -0.6931471805599453,
@@ -380,268 +387,260 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("May",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.30818059400012193,
-                               unseen = -6.182084906716631,
+                     ClassData{prior = -0.29944691403136736,
+                               unseen = -6.180016653652572,
                                likelihoods =
                                  HashMap.fromList
-                                   [("last <cycle>sunday", -5.486869473092628),
-                                    ("hourday", -4.388257184424518),
+                                   [("last <cycle>sunday", -5.484796933490655),
+                                    ("Koningsdagyear", -5.484796933490655),
+                                    ("hourday", -4.386184644822546),
                                     ("on a named-day<day-of-month> (non ordinal) <named-month>",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("<day-of-month> (non ordinal) <named-month><time-of-day>  o'clock",
-                                     -5.486869473092628),
-                                    ("dayhour", -2.3513752571634776),
-                                    ("daymonth", -4.570578741218473),
-                                    ("next <cycle>friday", -5.486869473092628),
-                                    ("monthyear", -3.8774315606585272),
+                                     -5.484796933490655),
+                                    ("dayhour", -2.3493027175615055),
+                                    ("daymonth", -4.5685062016165),
+                                    ("next <cycle>friday", -5.484796933490655),
+                                    ("monthyear", -3.8753590210565547),
                                     ("friday<day-of-month> (non ordinal) <named-month>",
-                                     -5.081404364984463),
-                                    ("yearhour", -5.486869473092628),
-                                    ("intersect<time-of-day>  o'clock", -4.793722292532682),
-                                    ("tuesdaythis <cycle>", -5.486869473092628),
-                                    ("christmasyear", -5.486869473092628),
+                                     -5.079331825382491),
+                                    ("yearhour", -5.484796933490655),
+                                    ("intersect<time-of-day>  o'clock", -4.791649752930709),
+                                    ("tuesdaythis <cycle>", -5.484796933490655),
                                     ("on a named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -5.081404364984463),
-                                    ("saturday<time-of-day>  o'clock", -5.486869473092628),
+                                     -5.079331825382491),
+                                    ("saturday<time-of-day>  o'clock", -5.484796933490655),
                                     ("absorption of , after named daydd/mm/yyyy",
-                                     -5.081404364984463),
-                                    ("<time-of-day> am|pmintersect", -5.486869473092628),
-                                    ("intersect<time> <part-of-day>", -4.793722292532682),
-                                    ("Marchyear", -5.486869473092628),
-                                    ("saturdayat <time-of-day>", -5.081404364984463),
-                                    ("saturday<time> <part-of-day>", -5.081404364984463),
-                                    ("dd/mm<time-of-day>  o'clock", -5.486869473092628),
-                                    ("on a named-dayat <time-of-day>", -4.793722292532682),
-                                    ("today<time-of-day>  o'clock", -5.486869473092628),
-                                    ("at <time-of-day>on a named-day", -5.486869473092628),
+                                     -5.079331825382491),
+                                    ("<time-of-day> am|pmintersect", -5.484796933490655),
+                                    ("intersect<time> <part-of-day>", -4.791649752930709),
+                                    ("Marchyear", -5.484796933490655),
+                                    ("saturdayat <time-of-day>", -5.079331825382491),
+                                    ("saturday<time> <part-of-day>", -5.079331825382491),
+                                    ("dd/mm<time-of-day>  o'clock", -5.484796933490655),
+                                    ("on a named-dayat <time-of-day>", -4.791649752930709),
+                                    ("today<time-of-day>  o'clock", -5.484796933490655),
+                                    ("at <time-of-day>on a named-day", -5.484796933490655),
                                     ("on a named-daybetween <datetime> and <datetime> (interval)",
-                                     -5.486869473092628),
-                                    ("intersect by ','year", -5.486869473092628),
-                                    ("on <date><time-of-day>  o'clock", -4.793722292532682),
-                                    ("next <cycle>monday", -5.486869473092628),
+                                     -5.484796933490655),
+                                    ("intersect by ','year", -5.484796933490655),
+                                    ("on <date><time-of-day>  o'clock", -4.791649752930709),
+                                    ("next <cycle>monday", -5.484796933490655),
                                     ("on a named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.486869473092628),
-                                    ("exactly <time-of-day>tomorrow", -5.486869473092628),
-                                    ("on a named-day<time> <part-of-day>", -5.081404364984463),
-                                    ("monthhour", -4.570578741218473),
+                                     -5.484796933490655),
+                                    ("exactly <time-of-day>tomorrow", -5.484796933490655),
+                                    ("on a named-day<time> <part-of-day>", -5.079331825382491),
+                                    ("monthhour", -4.5685062016165),
                                     ("on <date>between <datetime> and <datetime> (interval)",
-                                     -5.486869473092628),
-                                    ("last <day-of-week> of <time>year", -5.486869473092628),
-                                    ("on a named-day<time-of-day>  o'clock", -5.486869473092628),
-                                    ("next <cycle>March", -5.486869473092628),
-                                    ("todayat <time-of-day>", -4.793722292532682),
+                                     -5.484796933490655),
+                                    ("last <day-of-week> of <time>year", -5.484796933490655),
+                                    ("on a named-day<time-of-day>  o'clock", -5.484796933490655),
+                                    ("next <cycle>March", -5.484796933490655),
+                                    ("todayat <time-of-day>", -4.791649752930709),
                                     ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -5.486869473092628),
-                                    ("on <date>at <time-of-day>", -4.793722292532682),
-                                    ("thursday<time> timezone", -5.081404364984463),
-                                    ("on <date>about <time-of-day>", -4.793722292532682),
-                                    ("dayday", -3.184284380098582),
-                                    ("on <date><time> <part-of-day>", -4.570578741218473),
-                                    ("dd/mmabout <time-of-day>", -5.081404364984463),
-                                    ("<day-of-month> (ordinal)intersect", -5.486869473092628),
-                                    ("hourhour", -4.388257184424518),
+                                     -5.484796933490655),
+                                    ("on <date>at <time-of-day>", -4.791649752930709),
+                                    ("thursday<time> timezone", -5.079331825382491),
+                                    ("on <date>about <time-of-day>", -4.791649752930709),
+                                    ("dayday", -3.1822118404966093),
+                                    ("on <date><time> <part-of-day>", -4.5685062016165),
+                                    ("dd/mmabout <time-of-day>", -5.079331825382491),
+                                    ("<day-of-month> (ordinal)intersect", -5.484796933490655),
+                                    ("hourhour", -4.386184644822546),
                                     ("saturday<day-of-month> (non ordinal) <named-month>",
-                                     -5.486869473092628),
-                                    ("thursdayat <time-of-day>", -5.486869473092628),
+                                     -5.484796933490655),
+                                    ("thursdayat <time-of-day>", -5.484796933490655),
                                     ("today/tomorrow/yesterday afternoon<hour-of-day> <integer> (as relative minutes)",
-                                     -5.081404364984463),
+                                     -5.079331825382491),
                                     ("intersect<day-of-month> (non ordinal) <named-month>",
-                                     -4.388257184424518),
-                                    ("dayyear", -3.4074279314127915),
-                                    ("tuesdayafter <duration>", -5.486869473092628),
-                                    ("tomorrow<time-of-day>  o'clock", -5.486869473092628),
-                                    ("<time-of-day>  o'clocktomorrow", -4.793722292532682),
+                                     -4.386184644822546),
+                                    ("dayyear", -3.405355391810819),
+                                    ("tuesdayafter <duration>", -5.484796933490655),
+                                    ("tomorrow<time-of-day>  o'clock", -5.484796933490655),
+                                    ("<time-of-day>  o'clocktomorrow", -4.791649752930709),
                                     ("<day-of-month> (non ordinal) <named-month>intersect",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("thursdaybetween <datetime> and <datetime> (interval)",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("<day-of-month>(ordinal) <named-month>year",
-                                     -5.486869473092628),
-                                    ("<day-of-month> (ordinal)tuesday", -5.486869473092628),
-                                    ("hourminute", -4.793722292532682),
-                                    ("thursdayhh:mm", -5.486869473092628),
-                                    ("this <cycle>wednesday", -5.486869473092628),
+                                     -5.484796933490655),
+                                    ("<day-of-month> (ordinal)tuesday", -5.484796933490655),
+                                    ("hourminute", -4.791649752930709),
+                                    ("thursdayhh:mm", -5.484796933490655),
+                                    ("this <cycle>wednesday", -5.484796933490655),
                                     ("absorption of , after named day<named-month> <day-of-month> (non ordinal)",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("<day-of-month> (non ordinal) <named-month><time> <part-of-day>",
-                                     -5.081404364984463),
+                                     -5.079331825382491),
                                     ("on <date><day-of-month> (non ordinal) <named-month>",
-                                     -5.486869473092628),
-                                    ("Aprilabout <time-of-day>", -5.486869473092628),
+                                     -5.484796933490655),
+                                    ("Aprilabout <time-of-day>", -5.484796933490655),
                                     ("thursdayfrom <datetime> - <datetime> (interval)",
-                                     -5.486869473092628),
-                                    ("<day-of-month> (ordinal)February", -5.486869473092628),
+                                     -5.484796933490655),
+                                    ("<day-of-month> (ordinal)February", -5.484796933490655),
                                     ("thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.793722292532682),
+                                     -4.791649752930709),
                                     ("absorption of , after named day<day-of-month> (non ordinal) <named-month>",
-                                     -4.570578741218473),
+                                     -4.5685062016165),
                                     ("today/tomorrow/yesterday evening<time-of-day>  o'clock",
-                                     -5.486869473092628),
-                                    ("fridayintersect", -4.793722292532682),
+                                     -5.484796933490655),
+                                    ("fridayintersect", -4.791649752930709),
                                     ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("on <date><datetime> - <datetime> (interval)",
-                                     -5.486869473092628),
-                                    ("this <cycle>monday", -5.486869473092628),
-                                    ("April<time-of-day>  o'clock", -5.486869473092628),
-                                    ("next <cycle>wednesday", -5.486869473092628),
-                                    ("hh:mmintersect", -5.081404364984463),
+                                     -5.484796933490655),
+                                    ("this <cycle>monday", -5.484796933490655),
+                                    ("April<time-of-day>  o'clock", -5.484796933490655),
+                                    ("next <cycle>wednesday", -5.484796933490655),
+                                    ("hh:mmintersect", -5.079331825382491),
                                     ("thursday<datetime> - <datetime> (interval)",
-                                     -5.081404364984463),
-                                    ("<day-of-month> (ordinal)July", -5.486869473092628),
+                                     -5.079331825382491),
+                                    ("<day-of-month> (ordinal)July", -5.484796933490655),
                                     ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -5.081404364984463),
-                                    ("yearmonth", -5.486869473092628),
-                                    ("at <time-of-day>intersect", -5.081404364984463),
+                                     -5.079331825382491),
+                                    ("yearmonth", -5.484796933490655),
+                                    ("at <time-of-day>intersect", -5.079331825382491),
                                     ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.081404364984463),
+                                     -5.079331825382491),
                                     ("<time> <part-of-day>from <time-of-day> - <time-of-day> (interval)",
-                                     -5.486869473092628),
-                                    ("dayminute", -2.7788192719904172),
+                                     -5.484796933490655),
+                                    ("dayminute", -2.7767467323884447),
                                     ("<time> <part-of-day>from <datetime> - <datetime> (interval)",
-                                     -5.486869473092628),
-                                    ("intersectyear", -4.793722292532682),
-                                    ("<time-of-day> am|pmsaturday", -5.486869473092628),
-                                    ("<ordinal> <cycle> of <time>year", -5.486869473092628),
-                                    ("minuteday", -3.289644895756408),
+                                     -5.484796933490655),
+                                    ("intersectyear", -4.791649752930709),
+                                    ("<time-of-day> am|pmsaturday", -5.484796933490655),
+                                    ("<ordinal> <cycle> of <time>year", -5.484796933490655),
+                                    ("minuteday", -3.2875723561544357),
                                     ("absorption of , after named dayintersect",
-                                     -5.486869473092628),
-                                    ("Julyyear", -5.486869473092628),
-                                    ("year<time-of-day>  o'clock", -5.486869473092628),
-                                    ("Octoberyear", -4.388257184424518),
-                                    ("hh:mmon <date>", -5.081404364984463),
+                                     -5.484796933490655),
+                                    ("Julyyear", -5.484796933490655),
+                                    ("year<time-of-day>  o'clock", -5.484796933490655),
+                                    ("Octoberyear", -4.386184644822546),
+                                    ("hh:mmon <date>", -5.079331825382491),
                                     ("today/tomorrow/yesterday afternoonat <time-of-day>",
-                                     -5.486869473092628),
-                                    ("dd/mmyear", -5.486869473092628),
-                                    ("tuesdayin <duration>", -5.486869473092628),
-                                    ("Septemberyear", -5.081404364984463),
-                                    ("at <time-of-day>on <date>", -5.081404364984463),
-                                    ("absorption of , after named daydd/mm", -5.081404364984463),
-                                    ("intersectintersect", -5.486869473092628),
-                                    ("hh:mmon a named-day", -5.486869473092628),
-                                    ("weekday", -4.100575111972737),
-                                    ("dayweek", -4.793722292532682),
-                                    ("weekyear", -5.081404364984463),
-                                    ("on <date>February", -5.486869473092628),
-                                    ("<month> dd-dd (interval)year", -5.486869473092628),
-                                    ("Dutch King dayyear", -5.486869473092628),
-                                    ("tomorrowat <time-of-day>", -5.081404364984463),
-                                    ("next <cycle>tuesday", -5.486869473092628),
+                                     -5.484796933490655),
+                                    ("dd/mmyear", -5.484796933490655),
+                                    ("tuesdayin <duration>", -5.484796933490655),
+                                    ("Septemberyear", -5.079331825382491),
+                                    ("at <time-of-day>on <date>", -5.079331825382491),
+                                    ("absorption of , after named daydd/mm", -5.079331825382491),
+                                    ("intersectintersect", -5.484796933490655),
+                                    ("hh:mmon a named-day", -5.484796933490655),
+                                    ("weekday", -4.098502572370764),
+                                    ("dayweek", -4.791649752930709),
+                                    ("weekyear", -5.079331825382491),
+                                    ("on <date>February", -5.484796933490655),
+                                    ("Kerstmisyear", -5.484796933490655),
+                                    ("<month> dd-dd (interval)year", -5.484796933490655),
+                                    ("tomorrowat <time-of-day>", -5.079331825382491),
+                                    ("next <cycle>tuesday", -5.484796933490655),
                                     ("monday<day-of-month> (non ordinal) <named-month>",
-                                     -5.486869473092628),
-                                    ("at <time-of-day>tomorrow", -5.486869473092628),
+                                     -5.484796933490655),
+                                    ("at <time-of-day>tomorrow", -5.484796933490655),
                                     ("monday<named-month> <day-of-month> (non ordinal)",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("on a named-day<time-of-day> - <time-of-day> (interval)",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("today/tomorrow/yesterday eveningat <time-of-day>",
-                                     -5.081404364984463),
-                                    ("last <cycle> of <time>year", -5.081404364984463),
+                                     -5.079331825382491),
+                                    ("last <cycle> of <time>year", -5.079331825382491),
                                     ("on a named-day<datetime> - <datetime> (interval)",
-                                     -5.486869473092628),
+                                     -5.484796933490655),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.570578741218473),
-                                    ("April<time> <part-of-day>", -5.081404364984463)],
+                                     -4.5685062016165),
+                                    ("April<time> <part-of-day>", -5.079331825382491)],
                                n = 169},
                    koData =
-                     ClassData{prior = -1.327205444749884, unseen = -5.5909869805108565,
+                     ClassData{prior = -1.3518081850487211, unseen = -5.572154032177765,
                                likelihoods =
                                  HashMap.fromList
                                    [("<named-month> <day-of-month> (non ordinal)July",
-                                     -4.894101477840304),
-                                    ("dayhour", -3.5078071167204135),
-                                    ("on a named-dayafter <time-of-day>", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("dayhour", -3.488902962081261),
+                                    ("on a named-dayafter <time-of-day>", -4.875197323201151),
                                     ("July<day-of-month> (non ordinal) <named-month>",
-                                     -4.894101477840304),
-                                    ("daymonth", -3.977810745966149),
-                                    ("monthday", -4.48863636973214),
-                                    ("monthyear", -3.7954891891721947),
-                                    ("yearhour", -4.894101477840304),
-                                    ("intersect<time-of-day>  o'clock", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("daymonth", -3.9589065913269965),
+                                    ("monthday", -4.4697322150929875),
+                                    ("monthyear", -3.776585034533042),
+                                    ("yearhour", -4.875197323201151),
+                                    ("intersect<time-of-day>  o'clock", -4.875197323201151),
                                     ("on a named-dayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.48863636973214),
-                                    ("<day-of-month> (ordinal)wednesday", -4.48863636973214),
-                                    ("Julyintersect", -4.894101477840304),
-                                    ("thursdayafter <time-of-day>", -4.894101477840304),
-                                    ("intersect<time> <part-of-day>", -4.894101477840304),
-                                    ("Marchyear", -4.894101477840304),
-                                    ("<day-of-month> (ordinal)year", -4.894101477840304),
-                                    ("on a named-dayat <time-of-day>", -4.894101477840304),
+                                     -4.4697322150929875),
+                                    ("<day-of-month> (ordinal)wednesday", -4.4697322150929875),
+                                    ("Julyintersect", -4.875197323201151),
+                                    ("thursdayafter <time-of-day>", -4.875197323201151),
+                                    ("intersect<time> <part-of-day>", -4.875197323201151),
+                                    ("Marchyear", -4.875197323201151),
+                                    ("<day-of-month> (ordinal)year", -4.875197323201151),
+                                    ("on a named-dayat <time-of-day>", -4.875197323201151),
                                     ("on a named-daybetween <datetime> and <datetime> (interval)",
-                                     -4.894101477840304),
-                                    ("tuesdayafter <time-of-day>", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("tuesdayafter <time-of-day>", -4.875197323201151),
                                     ("on a named-daybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.894101477840304),
-                                    ("monthhour", -3.977810745966149),
+                                     -4.875197323201151),
+                                    ("monthhour", -3.9589065913269965),
                                     ("on <date>between <datetime> and <datetime> (interval)",
-                                     -4.894101477840304),
-                                    ("todayat <time-of-day>", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("todayat <time-of-day>", -4.875197323201151),
                                     ("on <date>between <time-of-day> and <time-of-day> (interval)",
-                                     -4.894101477840304),
-                                    ("on <date>at <time-of-day>", -4.894101477840304),
-                                    ("on <date>about <time-of-day>", -4.894101477840304),
-                                    ("dayday", -3.5078071167204135),
-                                    ("hourhour", -4.200954297280359),
-                                    ("thursdayat <time-of-day>", -4.894101477840304),
-                                    ("dayyear", -4.200954297280359),
+                                     -4.875197323201151),
+                                    ("on <date>at <time-of-day>", -4.875197323201151),
+                                    ("on <date>about <time-of-day>", -4.875197323201151),
+                                    ("dayday", -3.776585034533042),
+                                    ("hourhour", -4.182050142641207),
+                                    ("thursdayat <time-of-day>", -4.875197323201151),
+                                    ("dayyear", -4.182050142641207),
                                     ("thursdaybetween <time-of-day> and <time-of-day> (interval)",
-                                     -4.894101477840304),
+                                     -4.875197323201151),
                                     ("thursdaybetween <datetime> and <datetime> (interval)",
-                                     -4.894101477840304),
-                                    ("<day-of-month> (ordinal)tuesday", -4.48863636973214),
-                                    ("thursdayhh:mm", -4.48863636973214),
-                                    ("Aprilabout <time-of-day>", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("<day-of-month> (ordinal)tuesday", -4.4697322150929875),
+                                    ("thursdayhh:mm", -4.4697322150929875),
+                                    ("Aprilabout <time-of-day>", -4.875197323201151),
                                     ("thursdayfrom <datetime> - <datetime> (interval)",
-                                     -4.894101477840304),
-                                    ("Aprilyear", -4.894101477840304),
-                                    ("<day-of-month> (ordinal)sunday", -4.48863636973214),
+                                     -4.875197323201151),
+                                    ("Aprilyear", -4.875197323201151),
                                     ("thursdayfrom <time-of-day> - <time-of-day> (interval)",
-                                     -4.200954297280359),
-                                    ("mondayFebruary", -4.894101477840304),
+                                     -4.182050142641207),
+                                    ("mondayFebruary", -4.875197323201151),
                                     ("on <date><time-of-day> - <time-of-day> (interval)",
-                                     -4.894101477840304),
-                                    ("yearuntil <time-of-day>", -4.48863636973214),
+                                     -4.875197323201151),
+                                    ("yearuntil <time-of-day>", -4.4697322150929875),
                                     ("thursday<time-of-day> - <time-of-day> (interval)",
-                                     -4.48863636973214),
+                                     -4.4697322150929875),
                                     ("<named-month> <day-of-month> (non ordinal)August",
-                                     -4.894101477840304),
+                                     -4.875197323201151),
                                     ("August<day-of-month> (non ordinal) <named-month>",
-                                     -4.894101477840304),
+                                     -4.875197323201151),
                                     ("on <date>from <time-of-day> - <time-of-day> (interval)",
-                                     -4.48863636973214),
-                                    ("dayminute", -2.409194828052304),
-                                    ("thursday<part-of-day> of <time>", -4.894101477840304),
-                                    ("Julyyear", -4.48863636973214),
-                                    ("Octoberyear", -4.894101477840304),
+                                     -4.4697322150929875),
+                                    ("dayminute", -2.3902906734131513),
+                                    ("thursday<part-of-day> of <time>", -4.875197323201151),
+                                    ("Julyyear", -4.4697322150929875),
+                                    ("Octoberyear", -4.875197323201151),
                                     ("today/tomorrow/yesterday afternoonat <time-of-day>",
-                                     -4.48863636973214),
-                                    ("year<time> <part-of-day>", -4.894101477840304),
+                                     -4.4697322150929875),
+                                    ("year<time> <part-of-day>", -4.875197323201151),
                                     ("today/tomorrow/yesterday afternoon<time-of-day>  o'clock",
-                                     -4.894101477840304),
-                                    ("yearday", -4.48863636973214),
-                                    ("absorption of , after named dayFebruary", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("yearday", -4.4697322150929875),
+                                    ("absorption of , after named dayFebruary", -4.875197323201151),
                                     ("<day-of-month> (non ordinal) <named-month>about <time-of-day>",
-                                     -4.894101477840304),
-                                    ("after <time-of-day>year", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("after <time-of-day>year", -4.875197323201151),
                                     ("on a named-day<time-of-day> - <time-of-day> (interval)",
-                                     -4.894101477840304),
-                                    ("on <date>after <time-of-day>", -4.894101477840304),
+                                     -4.875197323201151),
+                                    ("on <date>after <time-of-day>", -4.875197323201151),
                                     ("<day-of-month> (non ordinal) <named-month>year",
-                                     -4.894101477840304)],
-                               n = 61}}),
+                                     -4.875197323201151)],
+                               n = 59}}),
        ("<ordinal> <cycle> of <time>",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.4849066497880004,
@@ -820,27 +819,24 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("nth <time> of <time>",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.044522437723423,
+                     ClassData{prior = -0.5596157879354228, unseen = -2.70805020110221,
                                likelihoods =
                                  HashMap.fromList
-                                   [("daymonth", -1.0498221244986778),
-                                    ("ordinals (first..19th)sundayMay", -2.3025850929940455),
-                                    ("ordinals (first..19th)tuesdayOctober", -2.3025850929940455),
-                                    ("ordinals (first..19th)sundayJune", -2.3025850929940455),
+                                   [("daymonth", -1.0296194171811581),
+                                    ("ordinals (first..19th)tuesdayOctober", -1.9459101490553135),
                                     ("ordinals (first..19th)wednesdayintersect",
-                                     -1.8971199848858813),
+                                     -1.540445040947149),
                                     ("ordinals (first..19th)tuesdayintersect",
-                                     -2.3025850929940455)],
-                               n = 6},
+                                     -1.9459101490553135)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -1.0986122886681098, unseen = -2.70805020110221,
+                     ClassData{prior = -0.8472978603872037,
+                               unseen = -2.5649493574615367,
                                likelihoods =
                                  HashMap.fromList
-                                   [("daymonth", -1.252762968495368),
-                                    ("ordinals (first..19th)wednesdayOctober", -1.540445040947149),
-                                    ("ordinals (first..19th)tuesdaySeptember",
-                                     -1.9459101490553135)],
+                                   [("daymonth", -1.0986122886681098),
+                                    ("ordinals (first..19th)wednesdayOctober", -1.3862943611198906),
+                                    ("ordinals (first..19th)tuesdaySeptember", -1.791759469228055)],
                                n = 3}}),
        ("the <day-of-month> (non ordinal)",
         Classifier{okData =
@@ -882,7 +878,7 @@
                                    [("hourhour", -0.6931471805599453),
                                     ("morningtime-of-day (latent)", -0.6931471805599453)],
                                n = 1}}),
-       ("valentine's day",
+       ("Vaderdag",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1},
@@ -937,7 +933,7 @@
                                    [("integer (numeric)", -9.53101798043249e-2),
                                     ("fractional number", -2.3978952727983707)],
                                n = 20}}),
-       ("new year's eve",
+       ("Nieuwjaarsdag",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2},
@@ -953,13 +949,6 @@
                      ClassData{prior = -1.3862943611198906,
                                unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2}}),
-       ("Mother's Day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("friday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.3025850929940455,
@@ -992,13 +981,6 @@
                    koData =
                      ClassData{prior = 0.0, unseen = -2.0794415416798357,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 6}}),
-       ("June",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("afternoon",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.5649493574615367,
@@ -1045,8 +1027,8 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("sunday",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
+                     ClassData{prior = 0.0, unseen = -2.1972245773362196,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 7},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -1153,8 +1135,8 @@
                                n = 68}}),
        ("ordinals (first..19th)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.5649493574615367,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 11},
+                     ClassData{prior = 0.0, unseen = -2.3978952727983707,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 9},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
@@ -1176,8 +1158,8 @@
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> <unit-of-duration>christmas", -0.6931471805599453),
-                                    ("yearday", -0.6931471805599453)],
+                                   [("yearday", -0.6931471805599453),
+                                    ("<integer> <unit-of-duration>Kerstmis", -0.6931471805599453)],
                                n = 1},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.0986122886681098,
@@ -1292,7 +1274,7 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<day-of-month> (ordinal)",
         Classifier{okData =
-                     ClassData{prior = -1.3862943611198906,
+                     ClassData{prior = -1.2809338454620642,
                                unseen = -2.0794415416798357,
                                likelihoods =
                                  HashMap.fromList
@@ -1300,12 +1282,19 @@
                                     ("ordinal (digits)", -0.5596157879354228)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.2876820724517809, unseen = -2.890371757896165,
+                     ClassData{prior = -0.325422400434628, unseen = -2.772588722239781,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..19th)", -0.5306282510621704),
-                                    ("ordinal (digits)", -0.8873031950009028)],
-                               n = 15}}),
+                                   [("ordinals (first..19th)", -0.6286086594223742),
+                                    ("ordinal (digits)", -0.7621400520468967)],
+                               n = 13}}),
+       ("Valentijnsdag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("until <time-of-day>",
         Classifier{okData =
                      ClassData{prior = -0.40546510810816444,
@@ -1402,20 +1391,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -1.9459101490553135,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("christmas",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("new year's day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Sinterklaas",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.6094379124341003,
@@ -1467,7 +1442,7 @@
                                    [("<integer> <unit-of-duration>", -0.6931471805599453),
                                     ("hour", -0.6931471805599453)],
                                n = 1}}),
-       ("halloween day",
+       ("Koningsdag",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.0986122886681098,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 1},
@@ -1624,8 +1599,8 @@
                      ClassData{prior = -0.6931471805599453, unseen = -1.791759469228055,
                                likelihoods =
                                  HashMap.fromList
-                                   [("ordinals (first..19th)tuesdaychristmas", -0.916290731874155),
-                                    ("dayday", -0.916290731874155)],
+                                   [("dayday", -0.916290731874155),
+                                    ("ordinals (first..19th)tuesdayKerstmis", -0.916290731874155)],
                                n = 1}}),
        ("<named-month> <day-of-month> (non ordinal)",
         Classifier{okData =
@@ -1741,6 +1716,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Oudjaar",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.3862943611198906,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("after <time-of-day>",
         Classifier{okData =
                      ClassData{prior = -0.587786664902119, unseen = -2.995732273553991,
@@ -1755,9 +1737,9 @@
                      ClassData{prior = -0.8109302162163288, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
-                                   [("intersect", -2.1400661634962708),
+                                   [("Kerstmis", -1.7346010553881064),
+                                    ("intersect", -2.1400661634962708),
                                     ("day", -1.4469189829363254), ("hh:mm", -2.1400661634962708),
-                                    ("christmas", -1.7346010553881064),
                                     ("minute", -2.1400661634962708)],
                                n = 4}}),
        ("day (grain)",
@@ -1767,6 +1749,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("Moederdag",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("<month> dd-dd (interval)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.639057329615259,
@@ -1777,13 +1766,6 @@
                                n = 5},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
-                               likelihoods = HashMap.fromList [], n = 0}}),
-       ("Dutch King day",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("summer",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/PL_XX.hs b/Duckling/Ranking/Classifiers/PL_XX.hs
--- a/Duckling/Ranking/Classifiers/PL_XX.hs
+++ b/Duckling/Ranking/Classifiers/PL_XX.hs
@@ -37,10 +37,10 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (numeric)",
         Classifier{okData =
-                     ClassData{prior = -0.5997731097824868, unseen = -4.875197323201151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 129},
+                     ClassData{prior = -0.5762828404206344, unseen = -4.927253685157205,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 136},
                    koData =
-                     ClassData{prior = -0.7961464200320919, unseen = -4.68213122712422,
+                     ClassData{prior = -0.8254986320446193, unseen = -4.68213122712422,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 106}}),
        ("exactly <time-of-day>",
         Classifier{okData =
@@ -390,6 +390,13 @@
                                    [("20th ordinal", -2.3513752571634776),
                                     ("first ordinal", -2.3513752571634776)],
                                n = 2}}),
+       ("November",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.791759469228055,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 4},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("July",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.9459101490553135,
@@ -427,6 +434,13 @@
                                    [("ordinal (digits)quarter (grain)", -0.916290731874155),
                                     ("quarter", -0.916290731874155)],
                                n = 1}}),
+       ("May",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -1.6094379124341003,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 3},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
                      ClassData{prior = -0.3189150921417123, unseen = -6.280395838960195,
@@ -2035,25 +2049,26 @@
                                n = 8}}),
        ("<day-of-month> (non ordinal) <named-month>",
         Classifier{okData =
-                     ClassData{prior = -0.1431008436406733,
-                               unseen = -3.5263605246161616,
+                     ClassData{prior = -9.53101798043249e-2,
+                               unseen = -3.912023005428146,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)September", -2.803360380906535),
-                                    ("integer (numeric)April", -2.803360380906535),
-                                    ("integer (numeric)August", -2.803360380906535),
-                                    ("integer (numeric)February", -1.1939224684724346),
-                                    ("month", -0.8574502318512216),
-                                    ("integer (numeric)March", -2.803360380906535)],
-                               n = 13},
+                                   [("integer (numeric)September", -3.1986731175506815),
+                                    ("integer (numeric)May", -2.505525936990736),
+                                    ("integer (numeric)April", -3.1986731175506815),
+                                    ("integer (numeric)August", -3.1986731175506815),
+                                    ("integer (numeric)February", -1.589235205116581),
+                                    ("month", -0.8472978603872037),
+                                    ("integer (numeric)November", -2.2823823856765264),
+                                    ("integer (numeric)March", -3.1986731175506815)],
+                               n = 20},
                    koData =
-                     ClassData{prior = -2.0149030205422647,
-                               unseen = -2.4849066497880004,
+                     ClassData{prior = -2.3978952727983707, unseen = -2.639057329615259,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)August", -1.7047480922384253),
-                                    ("month", -1.2992829841302609),
-                                    ("integer (numeric)July", -1.7047480922384253)],
+                                   [("integer (numeric)August", -1.8718021769015913),
+                                    ("month", -1.466337068793427),
+                                    ("integer (numeric)July", -1.8718021769015913)],
                                n = 2}}),
        ("this|next <day-of-week>",
         Classifier{okData =
diff --git a/Duckling/Ranking/Classifiers/TA_XX.hs b/Duckling/Ranking/Classifiers/TA_XX.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Ranking/Classifiers/TA_XX.hs
@@ -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.TA_XX (classifiers) where
+import Data.String
+import Prelude
+import qualified Data.HashMap.Strict as HashMap
+import Duckling.Ranking.Types
+
+classifiers :: Classifiers
+classifiers = HashMap.fromList []
diff --git a/Duckling/Ranking/Classifiers/ZH_CN.hs b/Duckling/Ranking/Classifiers/ZH_CN.hs
--- a/Duckling/Ranking/Classifiers/ZH_CN.hs
+++ b/Duckling/Ranking/Classifiers/ZH_CN.hs
@@ -95,10 +95,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (grain)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                     ClassData{prior = -1.0076405104623831,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
                    koData =
-                     ClassData{prior = -0.4700036292457356,
+                     ClassData{prior = -0.45425527227759643,
                                unseen = -3.7376696182833684,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
        ("<time-of-day> o'clock",
@@ -124,6 +125,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("number suffix: \21313",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Wednesday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.9444389791664407,
@@ -140,44 +148,43 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                   [("children's day<part-of-day> <dim time>", -3.367295829986474),
                                     ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.5705980791178364),
-                                    ("dayday", -1.9070703157390494),
-                                    ("hourhour", -3.005682604407159),
-                                    ("hourminute", -3.5165082281731497),
+                                     -1.7578579175523736),
+                                    ("dayday", -1.6094379124341003),
+                                    ("hourhour", -3.367295829986474),
+                                    ("hourminute", -3.367295829986474),
                                     ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.9070703157390494),
-                                    ("dayminute", -3.5165082281731497),
-                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                     -1.6094379124341003),
+                                    ("dayminute", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.5165082281731497),
-                                    ("yearday", -1.5705980791178364)],
-                               n = 42},
+                                     -3.367295829986474),
+                                    ("yearday", -1.7578579175523736)],
+                               n = 64},
                    koData =
-                     ClassData{prior = -1.0388930539664873,
-                               unseen = -4.1588830833596715,
+                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -2.1972245773362196),
-                                    ("dayhour", -2.5336968139574325),
-                                    ("daymonth", -2.063693184711697),
-                                    ("year (numeric with year symbol)February", -3.044522437723423),
+                                   [("children's day<part-of-day> <dim time>", -2.065455299705096),
+                                    ("dayhour", -2.653241964607215),
+                                    ("daymonth", -2.1832383353614793),
+                                    ("year (numeric with year symbol)February", -3.164067588373206),
                                     ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.044522437723423),
-                                    ("hourhour", -3.044522437723423),
-                                    ("year (numeric with year symbol)March", -2.5336968139574325),
-                                    ("hourminute", -3.044522437723423),
-                                    ("yearmonth", -2.1972245773362196),
-                                    ("dayminute", -3.044522437723423),
+                                     -3.164067588373206),
+                                    ("hourhour", -3.164067588373206),
+                                    ("year (numeric with year symbol)March", -2.653241964607215),
+                                    ("hourminute", -2.653241964607215),
+                                    ("yearmonth", -2.316769727986002),
+                                    ("dayminute", -2.653241964607215),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.044522437723423),
+                                     -2.653241964607215),
                                     ("absorption of , after named dayFebruary",
-                                     -2.063693184711697)],
-                               n = 23}}),
+                                     -2.1832383353614793)],
+                               n = 27}}),
        ("year (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8209805520698302,
@@ -193,25 +200,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("last tuesday, last july",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.7472144018302211,
@@ -301,48 +289,50 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> (latent time-of-day)",
         Classifier{okData =
-                     ClassData{prior = -1.3217558399823195,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -1.4170660197866443, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.2809338454620642),
-                                    ("integer (0..10)", -0.325422400434628)],
+                                   [("integer (numeric)", -1.3350010667323402),
+                                    ("integer (0..10)", -0.3794896217049037)],
                                n = 16},
                    koData =
-                     ClassData{prior = -0.3101549283038396,
-                               unseen = -3.8501476017100584,
+                     ClassData{prior = -0.2776317365982795,
+                               unseen = -3.9889840465642745,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -2.2192034840549946),
-                                    ("integer (0..10)", -0.11506932978478723)],
-                               n = 44}}),
+                                   [("integer (numeric)", -2.3608540011180215),
+                                    ("integer (0..10)", -0.28141245943818544),
+                                    ("<number>\20010/\20491", -1.890850371872286)],
+                               n = 50}}),
        ("nth <time> of <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
-                                    ("monthday", -0.7472144018302211),
+                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
+                                    ("monthday", -0.7308875085427924),
                                     ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.3350010667323402)],
-                               n = 8},
+                                     -1.0986122886681098)],
+                               n = 12},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (numeric with month symbol)",
         Classifier{okData =
-                     ClassData{prior = -0.13976194237515874,
-                               unseen = -3.7612001156935624,
+                     ClassData{prior = -0.10763066419236544,
+                               unseen = -3.891820298110627,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.0296194171811581),
-                                    ("integer (0..10)", -0.4418327522790392)],
-                               n = 40},
+                                   [("integer (numeric)", -1.1631508098056809),
+                                    ("number suffix: \21313", -2.2617630984737906),
+                                    ("integer (0..10)", -0.5753641449035618)],
+                               n = 44},
                    koData =
-                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                     ClassData{prior = -2.2823823856765264,
+                               unseen = -2.3025850929940455,
                                likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
-                               n = 6}}),
+                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
+                               n = 5}}),
        ("week (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8434293836092833,
@@ -451,12 +441,11 @@
                                n = 20}}),
        ("February",
         Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -2.833213344056216,
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 15},
                    koData =
-                     ClassData{prior = -2.772588722239781, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <cycle>",
         Classifier{okData =
                      ClassData{prior = -1.0185695809945732,
@@ -485,77 +474,75 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<dim time> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                     ClassData{prior = 0.0, unseen = -4.248495242049359,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -0.7514160886839211),
-                                    ("national dayevening|night", -2.871679624884012),
-                                    ("<named-month> <day-of-month>morning", -1.405342556090585),
-                                    ("children's dayafternoon", -2.871679624884012),
-                                    ("Mondaymorning", -1.7730673362159024)],
-                               n = 24},
+                                   [("dayhour", -0.7375989431307791),
+                                    ("national dayevening|night", -3.1354942159291497),
+                                    ("<named-month> <day-of-month>morning", -1.1895840668738362),
+                                    ("children's dayafternoon", -3.1354942159291497),
+                                    ("Mondaymorning", -2.03688192726104)],
+                               n = 32},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<part-of-day> <dim time>",
         Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.891820298110627,
+                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
                                likelihoods =
                                  HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
-                                    ("hourhour", -1.1631508098056809),
+                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
+                                    ("hourhour", -1.3523928094442093),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -2.0794415416798357),
-                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
-                                    ("hourminute", -1.9252908618525775),
+                                     -1.6625477377480489),
+                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
+                                    ("hourminute", -1.575536360758419),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -2.4849066497880004),
-                                    ("afternoonhh:mm (time-of-day)", -3.1780538303479458),
-                                    ("tonight<time-of-day> o'clock", -2.2617630984737906)],
-                               n = 20},
+                                     -2.6741486494265287),
+                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
+                               n = 25},
                    koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                     ClassData{prior = -0.7841189587656721,
+                               unseen = -3.9318256327243257,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourhour", -1.2039728043259361),
+                                   [("hourhour", -1.4271163556401458),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.8971199848858813),
-                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
-                                    ("hourminute", -1.8971199848858813),
+                                     -1.5141277326297755),
+                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
+                                    ("hourminute", -1.5141277326297755),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -1.742969305058623)],
-                               n = 16}}),
+                                     -1.9661128563728327)],
+                               n = 21}}),
        ("<integer> <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                     ClassData{prior = 0.0, unseen = -5.905361848054571,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.6560549059838294),
-                                    ("integer (0..10)month (grain)", -2.068268241081711),
-                                    ("integer (0..10)hour (grain)", -2.8304082931286074),
-                                    ("second", -3.235873401236772),
-                                    ("integer (0..10)day (grain)", -3.0417173867958143),
-                                    ("integer (0..10)year (grain)", -3.572345637857985),
-                                    ("integer (numeric)year (grain)", -3.1668805297498204),
-                                    ("integer (0..10)second (grain)", -3.235873401236772),
-                                    ("day", -3.0417173867958143), ("year", -2.6968769005040847),
-                                    ("integer (0..10)minute (grain)", -3.0417173867958143),
-                                    ("hour", -2.8304082931286074),
-                                    ("integer (0..10)week (grain)", -2.6560549059838294),
-                                    ("month", -1.7973932869463112),
-                                    ("integer (numeric)month (grain)", -3.1668805297498204),
-                                    ("minute", -3.0417173867958143)],
-                               n = 170}}),
-       ("integer (11..19)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                                   [("week", -2.6837575085331653),
+                                    ("integer (0..10)month (grain)", -2.535337503414892),
+                                    ("integer (0..10)hour (grain)", -3.06941998934515),
+                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
+                                    ("second", -3.2635760037861075),
+                                    ("integer (0..10)day (grain)", -3.06941998934515),
+                                    ("number suffix: \21313month (grain)", -4.293195420967266),
+                                    ("integer (0..10)year (grain)", -3.6000482404073204),
+                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
+                                    ("integer (numeric)year (grain)", -3.1945831322991562),
+                                    ("integer (0..10)second (grain)", -3.2635760037861075),
+                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
+                                    ("integer (0..10)minute (grain)", -3.06941998934515),
+                                    ("hour", -2.8581108956779433),
+                                    ("integer (0..10)week (grain)", -3.1945831322991562),
+                                    ("month", -1.7754989483562746),
+                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
+                                    ("integer (numeric)month (grain)", -3.1945831322991562),
+                                    ("minute", -3.06941998934515)],
+                               n = 173}}),
        ("<time-of-day> am|pm",
         Classifier{okData =
                      ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
@@ -575,21 +562,25 @@
                                n = 3}}),
        ("relative minutes after|past <integer> (hour-of-day)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (11..19)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5},
+                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.7801585575495751),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (0..10)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5}}),
+                                   [("<integer> (latent time-of-day)number suffix: \21313",
+                                     -1.3862943611198906),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.3862943611198906),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10}}),
        ("army's day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -599,21 +590,31 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by \",\"",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
-                                    ("dayday", -0.7576857016975165)],
-                               n = 14},
+                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
+                                    ("dayday", -0.7270487322356266)],
+                               n = 28},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
+                     ClassData{prior = -1.6094379124341003,
                                unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -0.8109302162163288),
                                     ("SundayFebruary", -0.8109302162163288)],
                                n = 7}}),
+       ("integer with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("second (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.70805020110221,
@@ -637,23 +638,21 @@
                                n = 20}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -1.2286654169163076,
+                               unseen = -3.4657359027997265,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
+                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
+                                    ("Tuesday", -1.6422277352570913)],
                                n = 12},
                    koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
+                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("month (numeric with month symbol)", -2.5649493574615367),
+                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
+                               n = 29}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -670,22 +669,22 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next <time>",
         Classifier{okData =
-                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                     ClassData{prior = -1.6486586255873816, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
                                    [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.24512245803298496,
-                               unseen = -3.784189633918261,
+                     ClassData{prior = -0.21357410029805904,
+                               unseen = -3.912023005428146,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Wednesday", -1.9694406464655074),
-                                    ("<integer> (latent time-of-day)", -1.1962507582320256),
-                                    ("month (numeric with month symbol)", -3.068052935133617),
-                                    ("day", -1.9694406464655074), ("hour", -1.1962507582320256),
-                                    ("month", -3.068052935133617)],
-                               n = 18}}),
+                                   [("Wednesday", -2.1000608288825715),
+                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
+                                    ("month (numeric with month symbol)", -3.1986731175506815),
+                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
+                                    ("month", -3.1986731175506815)],
+                               n = 21}}),
        ("last <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.8472978603872037,
@@ -722,24 +721,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.3877429013343523),
-                                    ("integer (0..10)month (grain)", -2.793208009442517),
-                                    ("integer (0..10)hour (grain)", -2.3877429013343523),
-                                    ("second", -2.793208009442517),
-                                    ("integer (0..10)day (grain)", -2.505525936990736),
-                                    ("integer (0..10)year (grain)", -3.1986731175506815),
-                                    ("integer (0..10)second (grain)", -2.793208009442517),
-                                    ("day", -2.505525936990736), ("year", -3.1986731175506815),
-                                    ("integer (0..10)minute (grain)", -2.639057329615259),
-                                    ("hour", -2.3877429013343523),
-                                    ("integer (0..10)week (grain)", -2.3877429013343523),
-                                    ("month", -2.793208009442517), ("minute", -2.639057329615259)],
+                                   [("week", -2.4079456086518722),
+                                    ("integer (0..10)hour (grain)", -2.659260036932778),
+                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
+                                    ("second", -2.8134107167600364),
+                                    ("integer (0..10)day (grain)", -2.5257286443082556),
+                                    ("integer (0..10)year (grain)", -3.2188758248682006),
+                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
+                                    ("integer (0..10)second (grain)", -2.8134107167600364),
+                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
+                                    ("integer (0..10)minute (grain)", -2.659260036932778),
+                                    ("hour", -2.4079456086518722),
+                                    ("integer (0..10)week (grain)", -2.995732273553991),
+                                    ("month", -2.8134107167600364),
+                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
+                                    ("minute", -2.659260036932778)],
                                n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Tuesday",
         Classifier{okData =
@@ -757,79 +759,95 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                     ClassData{prior = 0.0, unseen = -5.231108616854587,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Marchinteger (0..10)", -3.028522096376982),
-                                    ("Februaryinteger (11..19)", -2.6230569882688175),
-                                    ("month (numeric with month symbol)integer (11..19)",
-                                     -2.6230569882688175),
-                                    ("Marchinteger (numeric)", -3.721669276936927),
+                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Marchinteger (0..10)", -3.4339872044851463),
+                                    ("Marchinteger (numeric)", -4.127134385045092),
                                     ("month (numeric with month symbol)integer (numeric)",
-                                     -2.1122313645028266),
-                                    ("Februaryinteger (0..10)", -2.740840023925201),
-                                    ("month", -0.7427441216993174),
+                                     -2.517696472610991),
+                                    ("Februaryinteger (0..10)", -3.146305132033365),
+                                    ("month (numeric with month symbol)number suffix: \21313",
+                                     -3.146305132033365),
+                                    ("month", -0.7371103039810614),
                                     ("month (numeric with month symbol)integer (0..10)",
-                                     -2.1122313645028266)],
-                               n = 58},
+                                     -2.517696472610991),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
+                               n = 88},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (0..10)",
         Classifier{okData =
-                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                     ClassData{prior = -0.38372512147175847,
+                               unseen = -5.236441962829949,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
                    koData =
-                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+                     ClassData{prior = -1.143563676530376, unseen = -4.48863636973214,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 87}}),
        ("last n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.995732273553991),
-                                    ("integer (0..10)month (grain)", -2.120263536200091),
-                                    ("integer (0..10)hour (grain)", -2.4079456086518722),
-                                    ("second", -2.659260036932778),
-                                    ("integer (0..10)day (grain)", -2.995732273553991),
-                                    ("integer (0..10)year (grain)", -3.506557897319982),
-                                    ("integer (0..10)second (grain)", -2.659260036932778),
-                                    ("day", -2.995732273553991), ("year", -3.506557897319982),
-                                    ("integer (0..10)minute (grain)", -2.4079456086518722),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.120263536200091), ("minute", -2.4079456086518722)],
-                               n = 43},
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ordinal (digits)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 4},
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
+                               n = 4}}),
        ("n <cycle> last",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                     ClassData{prior = 0.0, unseen = -4.04305126783455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.379546134130174),
-                                    ("integer (0..10)month (grain)", -2.890371757896165),
-                                    ("integer (0..10)hour (grain)", -2.379546134130174),
-                                    ("second", -2.890371757896165),
-                                    ("integer (0..10)day (grain)", -2.379546134130174),
-                                    ("integer (0..10)year (grain)", -2.890371757896165),
-                                    ("integer (0..10)second (grain)", -2.890371757896165),
-                                    ("day", -2.379546134130174), ("year", -2.890371757896165),
-                                    ("integer (0..10)minute (grain)", -2.890371757896165),
-                                    ("hour", -2.379546134130174),
-                                    ("integer (0..10)week (grain)", -2.379546134130174),
-                                    ("month", -2.890371757896165), ("minute", -2.890371757896165)],
+                                   [("week", -2.4159137783010487),
+                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
+                                    ("second", -2.9267394020670396),
+                                    ("integer (0..10)day (grain)", -2.4159137783010487),
+                                    ("integer (0..10)year (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
+                                    ("integer (0..10)second (grain)", -2.9267394020670396),
+                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
+                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
+                                    ("hour", -2.4159137783010487),
+                                    ("integer (0..10)week (grain)", -2.9267394020670396),
+                                    ("month", -2.9267394020670396),
+                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
+                                    ("minute", -2.9267394020670396)],
                                n = 20},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("morning",
         Classifier{okData =
@@ -864,6 +882,13 @@
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
diff --git a/Duckling/Ranking/Classifiers/ZH_HK.hs b/Duckling/Ranking/Classifiers/ZH_HK.hs
--- a/Duckling/Ranking/Classifiers/ZH_HK.hs
+++ b/Duckling/Ranking/Classifiers/ZH_HK.hs
@@ -95,10 +95,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (grain)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                     ClassData{prior = -1.0076405104623831,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
                    koData =
-                     ClassData{prior = -0.4700036292457356,
+                     ClassData{prior = -0.45425527227759643,
                                unseen = -3.7376696182833684,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
        ("<time-of-day> o'clock",
@@ -124,6 +125,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("number suffix: \21313",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Wednesday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.9444389791664407,
@@ -140,44 +148,43 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                   [("children's day<part-of-day> <dim time>", -3.367295829986474),
                                     ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.5705980791178364),
-                                    ("dayday", -1.9070703157390494),
-                                    ("hourhour", -3.005682604407159),
-                                    ("hourminute", -3.5165082281731497),
+                                     -1.7578579175523736),
+                                    ("dayday", -1.6094379124341003),
+                                    ("hourhour", -3.367295829986474),
+                                    ("hourminute", -3.367295829986474),
                                     ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.9070703157390494),
-                                    ("dayminute", -3.5165082281731497),
-                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                     -1.6094379124341003),
+                                    ("dayminute", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.5165082281731497),
-                                    ("yearday", -1.5705980791178364)],
-                               n = 42},
+                                     -3.367295829986474),
+                                    ("yearday", -1.7578579175523736)],
+                               n = 64},
                    koData =
-                     ClassData{prior = -1.0388930539664873,
-                               unseen = -4.1588830833596715,
+                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -2.1972245773362196),
-                                    ("dayhour", -2.5336968139574325),
-                                    ("daymonth", -2.063693184711697),
-                                    ("year (numeric with year symbol)February", -3.044522437723423),
+                                   [("children's day<part-of-day> <dim time>", -2.065455299705096),
+                                    ("dayhour", -2.653241964607215),
+                                    ("daymonth", -2.1832383353614793),
+                                    ("year (numeric with year symbol)February", -3.164067588373206),
                                     ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.044522437723423),
-                                    ("hourhour", -3.044522437723423),
-                                    ("year (numeric with year symbol)March", -2.5336968139574325),
-                                    ("hourminute", -3.044522437723423),
-                                    ("yearmonth", -2.1972245773362196),
-                                    ("dayminute", -3.044522437723423),
+                                     -3.164067588373206),
+                                    ("hourhour", -3.164067588373206),
+                                    ("year (numeric with year symbol)March", -2.653241964607215),
+                                    ("hourminute", -2.653241964607215),
+                                    ("yearmonth", -2.316769727986002),
+                                    ("dayminute", -2.653241964607215),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.044522437723423),
+                                     -2.653241964607215),
                                     ("absorption of , after named dayFebruary",
-                                     -2.063693184711697)],
-                               n = 23}}),
+                                     -2.1832383353614793)],
+                               n = 27}}),
        ("year (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8209805520698302,
@@ -193,25 +200,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("last tuesday, last july",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.7472144018302211,
@@ -301,48 +289,50 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> (latent time-of-day)",
         Classifier{okData =
-                     ClassData{prior = -1.3217558399823195,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -1.4170660197866443, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.2809338454620642),
-                                    ("integer (0..10)", -0.325422400434628)],
+                                   [("integer (numeric)", -1.3350010667323402),
+                                    ("integer (0..10)", -0.3794896217049037)],
                                n = 16},
                    koData =
-                     ClassData{prior = -0.3101549283038396,
-                               unseen = -3.8501476017100584,
+                     ClassData{prior = -0.2776317365982795,
+                               unseen = -3.9889840465642745,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -2.2192034840549946),
-                                    ("integer (0..10)", -0.11506932978478723)],
-                               n = 44}}),
+                                   [("integer (numeric)", -2.3608540011180215),
+                                    ("integer (0..10)", -0.28141245943818544),
+                                    ("<number>\20010/\20491", -1.890850371872286)],
+                               n = 50}}),
        ("nth <time> of <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
-                                    ("monthday", -0.7472144018302211),
+                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
+                                    ("monthday", -0.7308875085427924),
                                     ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.3350010667323402)],
-                               n = 8},
+                                     -1.0986122886681098)],
+                               n = 12},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (numeric with month symbol)",
         Classifier{okData =
-                     ClassData{prior = -0.13976194237515874,
-                               unseen = -3.7612001156935624,
+                     ClassData{prior = -0.10763066419236544,
+                               unseen = -3.891820298110627,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.0296194171811581),
-                                    ("integer (0..10)", -0.4418327522790392)],
-                               n = 40},
+                                   [("integer (numeric)", -1.1631508098056809),
+                                    ("number suffix: \21313", -2.2617630984737906),
+                                    ("integer (0..10)", -0.5753641449035618)],
+                               n = 44},
                    koData =
-                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                     ClassData{prior = -2.2823823856765264,
+                               unseen = -2.3025850929940455,
                                likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
-                               n = 6}}),
+                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
+                               n = 5}}),
        ("week (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8434293836092833,
@@ -451,12 +441,11 @@
                                n = 20}}),
        ("February",
         Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -2.833213344056216,
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 15},
                    koData =
-                     ClassData{prior = -2.772588722239781, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <cycle>",
         Classifier{okData =
                      ClassData{prior = -1.0185695809945732,
@@ -485,77 +474,75 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<dim time> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                     ClassData{prior = 0.0, unseen = -4.248495242049359,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -0.7514160886839211),
-                                    ("national dayevening|night", -2.871679624884012),
-                                    ("<named-month> <day-of-month>morning", -1.405342556090585),
-                                    ("children's dayafternoon", -2.871679624884012),
-                                    ("Mondaymorning", -1.7730673362159024)],
-                               n = 24},
+                                   [("dayhour", -0.7375989431307791),
+                                    ("national dayevening|night", -3.1354942159291497),
+                                    ("<named-month> <day-of-month>morning", -1.1895840668738362),
+                                    ("children's dayafternoon", -3.1354942159291497),
+                                    ("Mondaymorning", -2.03688192726104)],
+                               n = 32},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<part-of-day> <dim time>",
         Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.891820298110627,
+                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
                                likelihoods =
                                  HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
-                                    ("hourhour", -1.1631508098056809),
+                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
+                                    ("hourhour", -1.3523928094442093),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -2.0794415416798357),
-                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
-                                    ("hourminute", -1.9252908618525775),
+                                     -1.6625477377480489),
+                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
+                                    ("hourminute", -1.575536360758419),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -2.4849066497880004),
-                                    ("afternoonhh:mm (time-of-day)", -3.1780538303479458),
-                                    ("tonight<time-of-day> o'clock", -2.2617630984737906)],
-                               n = 20},
+                                     -2.6741486494265287),
+                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
+                               n = 25},
                    koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                     ClassData{prior = -0.7841189587656721,
+                               unseen = -3.9318256327243257,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourhour", -1.2039728043259361),
+                                   [("hourhour", -1.4271163556401458),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.8971199848858813),
-                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
-                                    ("hourminute", -1.8971199848858813),
+                                     -1.5141277326297755),
+                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
+                                    ("hourminute", -1.5141277326297755),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -1.742969305058623)],
-                               n = 16}}),
+                                     -1.9661128563728327)],
+                               n = 21}}),
        ("<integer> <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                     ClassData{prior = 0.0, unseen = -5.905361848054571,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.6560549059838294),
-                                    ("integer (0..10)month (grain)", -2.068268241081711),
-                                    ("integer (0..10)hour (grain)", -2.8304082931286074),
-                                    ("second", -3.235873401236772),
-                                    ("integer (0..10)day (grain)", -3.0417173867958143),
-                                    ("integer (0..10)year (grain)", -3.572345637857985),
-                                    ("integer (numeric)year (grain)", -3.1668805297498204),
-                                    ("integer (0..10)second (grain)", -3.235873401236772),
-                                    ("day", -3.0417173867958143), ("year", -2.6968769005040847),
-                                    ("integer (0..10)minute (grain)", -3.0417173867958143),
-                                    ("hour", -2.8304082931286074),
-                                    ("integer (0..10)week (grain)", -2.6560549059838294),
-                                    ("month", -1.7973932869463112),
-                                    ("integer (numeric)month (grain)", -3.1668805297498204),
-                                    ("minute", -3.0417173867958143)],
-                               n = 170}}),
-       ("integer (11..19)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                                   [("week", -2.6837575085331653),
+                                    ("integer (0..10)month (grain)", -2.535337503414892),
+                                    ("integer (0..10)hour (grain)", -3.06941998934515),
+                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
+                                    ("second", -3.2635760037861075),
+                                    ("integer (0..10)day (grain)", -3.06941998934515),
+                                    ("number suffix: \21313month (grain)", -4.293195420967266),
+                                    ("integer (0..10)year (grain)", -3.6000482404073204),
+                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
+                                    ("integer (numeric)year (grain)", -3.1945831322991562),
+                                    ("integer (0..10)second (grain)", -3.2635760037861075),
+                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
+                                    ("integer (0..10)minute (grain)", -3.06941998934515),
+                                    ("hour", -2.8581108956779433),
+                                    ("integer (0..10)week (grain)", -3.1945831322991562),
+                                    ("month", -1.7754989483562746),
+                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
+                                    ("integer (numeric)month (grain)", -3.1945831322991562),
+                                    ("minute", -3.06941998934515)],
+                               n = 173}}),
        ("<time-of-day> am|pm",
         Classifier{okData =
                      ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
@@ -575,21 +562,25 @@
                                n = 3}}),
        ("relative minutes after|past <integer> (hour-of-day)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (11..19)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5},
+                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.7801585575495751),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (0..10)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5}}),
+                                   [("<integer> (latent time-of-day)number suffix: \21313",
+                                     -1.3862943611198906),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.3862943611198906),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10}}),
        ("army's day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -599,21 +590,31 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by \",\"",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
-                                    ("dayday", -0.7576857016975165)],
-                               n = 14},
+                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
+                                    ("dayday", -0.7270487322356266)],
+                               n = 28},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
+                     ClassData{prior = -1.6094379124341003,
                                unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -0.8109302162163288),
                                     ("SundayFebruary", -0.8109302162163288)],
                                n = 7}}),
+       ("integer with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("second (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.70805020110221,
@@ -637,23 +638,21 @@
                                n = 20}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -1.2286654169163076,
+                               unseen = -3.4657359027997265,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
+                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
+                                    ("Tuesday", -1.6422277352570913)],
                                n = 12},
                    koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
+                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("month (numeric with month symbol)", -2.5649493574615367),
+                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
+                               n = 29}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -670,22 +669,22 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next <time>",
         Classifier{okData =
-                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                     ClassData{prior = -1.6486586255873816, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
                                    [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.24512245803298496,
-                               unseen = -3.784189633918261,
+                     ClassData{prior = -0.21357410029805904,
+                               unseen = -3.912023005428146,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Wednesday", -1.9694406464655074),
-                                    ("<integer> (latent time-of-day)", -1.1962507582320256),
-                                    ("month (numeric with month symbol)", -3.068052935133617),
-                                    ("day", -1.9694406464655074), ("hour", -1.1962507582320256),
-                                    ("month", -3.068052935133617)],
-                               n = 18}}),
+                                   [("Wednesday", -2.1000608288825715),
+                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
+                                    ("month (numeric with month symbol)", -3.1986731175506815),
+                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
+                                    ("month", -3.1986731175506815)],
+                               n = 21}}),
        ("last <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.8472978603872037,
@@ -722,24 +721,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.3877429013343523),
-                                    ("integer (0..10)month (grain)", -2.793208009442517),
-                                    ("integer (0..10)hour (grain)", -2.3877429013343523),
-                                    ("second", -2.793208009442517),
-                                    ("integer (0..10)day (grain)", -2.505525936990736),
-                                    ("integer (0..10)year (grain)", -3.1986731175506815),
-                                    ("integer (0..10)second (grain)", -2.793208009442517),
-                                    ("day", -2.505525936990736), ("year", -3.1986731175506815),
-                                    ("integer (0..10)minute (grain)", -2.639057329615259),
-                                    ("hour", -2.3877429013343523),
-                                    ("integer (0..10)week (grain)", -2.3877429013343523),
-                                    ("month", -2.793208009442517), ("minute", -2.639057329615259)],
+                                   [("week", -2.4079456086518722),
+                                    ("integer (0..10)hour (grain)", -2.659260036932778),
+                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
+                                    ("second", -2.8134107167600364),
+                                    ("integer (0..10)day (grain)", -2.5257286443082556),
+                                    ("integer (0..10)year (grain)", -3.2188758248682006),
+                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
+                                    ("integer (0..10)second (grain)", -2.8134107167600364),
+                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
+                                    ("integer (0..10)minute (grain)", -2.659260036932778),
+                                    ("hour", -2.4079456086518722),
+                                    ("integer (0..10)week (grain)", -2.995732273553991),
+                                    ("month", -2.8134107167600364),
+                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
+                                    ("minute", -2.659260036932778)],
                                n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Tuesday",
         Classifier{okData =
@@ -757,79 +759,95 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                     ClassData{prior = 0.0, unseen = -5.231108616854587,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Marchinteger (0..10)", -3.028522096376982),
-                                    ("Februaryinteger (11..19)", -2.6230569882688175),
-                                    ("month (numeric with month symbol)integer (11..19)",
-                                     -2.6230569882688175),
-                                    ("Marchinteger (numeric)", -3.721669276936927),
+                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Marchinteger (0..10)", -3.4339872044851463),
+                                    ("Marchinteger (numeric)", -4.127134385045092),
                                     ("month (numeric with month symbol)integer (numeric)",
-                                     -2.1122313645028266),
-                                    ("Februaryinteger (0..10)", -2.740840023925201),
-                                    ("month", -0.7427441216993174),
+                                     -2.517696472610991),
+                                    ("Februaryinteger (0..10)", -3.146305132033365),
+                                    ("month (numeric with month symbol)number suffix: \21313",
+                                     -3.146305132033365),
+                                    ("month", -0.7371103039810614),
                                     ("month (numeric with month symbol)integer (0..10)",
-                                     -2.1122313645028266)],
-                               n = 58},
+                                     -2.517696472610991),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
+                               n = 88},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (0..10)",
         Classifier{okData =
-                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                     ClassData{prior = -0.38372512147175847,
+                               unseen = -5.236441962829949,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
                    koData =
-                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+                     ClassData{prior = -1.143563676530376, unseen = -4.48863636973214,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 87}}),
        ("last n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.995732273553991),
-                                    ("integer (0..10)month (grain)", -2.120263536200091),
-                                    ("integer (0..10)hour (grain)", -2.4079456086518722),
-                                    ("second", -2.659260036932778),
-                                    ("integer (0..10)day (grain)", -2.995732273553991),
-                                    ("integer (0..10)year (grain)", -3.506557897319982),
-                                    ("integer (0..10)second (grain)", -2.659260036932778),
-                                    ("day", -2.995732273553991), ("year", -3.506557897319982),
-                                    ("integer (0..10)minute (grain)", -2.4079456086518722),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.120263536200091), ("minute", -2.4079456086518722)],
-                               n = 43},
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ordinal (digits)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 4},
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
+                               n = 4}}),
        ("n <cycle> last",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                     ClassData{prior = 0.0, unseen = -4.04305126783455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.379546134130174),
-                                    ("integer (0..10)month (grain)", -2.890371757896165),
-                                    ("integer (0..10)hour (grain)", -2.379546134130174),
-                                    ("second", -2.890371757896165),
-                                    ("integer (0..10)day (grain)", -2.379546134130174),
-                                    ("integer (0..10)year (grain)", -2.890371757896165),
-                                    ("integer (0..10)second (grain)", -2.890371757896165),
-                                    ("day", -2.379546134130174), ("year", -2.890371757896165),
-                                    ("integer (0..10)minute (grain)", -2.890371757896165),
-                                    ("hour", -2.379546134130174),
-                                    ("integer (0..10)week (grain)", -2.379546134130174),
-                                    ("month", -2.890371757896165), ("minute", -2.890371757896165)],
+                                   [("week", -2.4159137783010487),
+                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
+                                    ("second", -2.9267394020670396),
+                                    ("integer (0..10)day (grain)", -2.4159137783010487),
+                                    ("integer (0..10)year (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
+                                    ("integer (0..10)second (grain)", -2.9267394020670396),
+                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
+                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
+                                    ("hour", -2.4159137783010487),
+                                    ("integer (0..10)week (grain)", -2.9267394020670396),
+                                    ("month", -2.9267394020670396),
+                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
+                                    ("minute", -2.9267394020670396)],
                                n = 20},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("morning",
         Classifier{okData =
@@ -864,6 +882,13 @@
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
diff --git a/Duckling/Ranking/Classifiers/ZH_MO.hs b/Duckling/Ranking/Classifiers/ZH_MO.hs
--- a/Duckling/Ranking/Classifiers/ZH_MO.hs
+++ b/Duckling/Ranking/Classifiers/ZH_MO.hs
@@ -95,10 +95,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (grain)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                     ClassData{prior = -1.0076405104623831,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
                    koData =
-                     ClassData{prior = -0.4700036292457356,
+                     ClassData{prior = -0.45425527227759643,
                                unseen = -3.7376696182833684,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
        ("<time-of-day> o'clock",
@@ -124,6 +125,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("number suffix: \21313",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Wednesday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.9444389791664407,
@@ -140,44 +148,43 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                   [("children's day<part-of-day> <dim time>", -3.367295829986474),
                                     ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.5705980791178364),
-                                    ("dayday", -1.9070703157390494),
-                                    ("hourhour", -3.005682604407159),
-                                    ("hourminute", -3.5165082281731497),
+                                     -1.7578579175523736),
+                                    ("dayday", -1.6094379124341003),
+                                    ("hourhour", -3.367295829986474),
+                                    ("hourminute", -3.367295829986474),
                                     ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.9070703157390494),
-                                    ("dayminute", -3.5165082281731497),
-                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                     -1.6094379124341003),
+                                    ("dayminute", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.5165082281731497),
-                                    ("yearday", -1.5705980791178364)],
-                               n = 42},
+                                     -3.367295829986474),
+                                    ("yearday", -1.7578579175523736)],
+                               n = 64},
                    koData =
-                     ClassData{prior = -1.0388930539664873,
-                               unseen = -4.1588830833596715,
+                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -2.1972245773362196),
-                                    ("dayhour", -2.5336968139574325),
-                                    ("daymonth", -2.063693184711697),
-                                    ("year (numeric with year symbol)February", -3.044522437723423),
+                                   [("children's day<part-of-day> <dim time>", -2.065455299705096),
+                                    ("dayhour", -2.653241964607215),
+                                    ("daymonth", -2.1832383353614793),
+                                    ("year (numeric with year symbol)February", -3.164067588373206),
                                     ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.044522437723423),
-                                    ("hourhour", -3.044522437723423),
-                                    ("year (numeric with year symbol)March", -2.5336968139574325),
-                                    ("hourminute", -3.044522437723423),
-                                    ("yearmonth", -2.1972245773362196),
-                                    ("dayminute", -3.044522437723423),
+                                     -3.164067588373206),
+                                    ("hourhour", -3.164067588373206),
+                                    ("year (numeric with year symbol)March", -2.653241964607215),
+                                    ("hourminute", -2.653241964607215),
+                                    ("yearmonth", -2.316769727986002),
+                                    ("dayminute", -2.653241964607215),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.044522437723423),
+                                     -2.653241964607215),
                                     ("absorption of , after named dayFebruary",
-                                     -2.063693184711697)],
-                               n = 23}}),
+                                     -2.1832383353614793)],
+                               n = 27}}),
        ("year (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8209805520698302,
@@ -193,25 +200,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("last tuesday, last july",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.7472144018302211,
@@ -301,48 +289,50 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> (latent time-of-day)",
         Classifier{okData =
-                     ClassData{prior = -1.3217558399823195,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -1.4170660197866443, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.2809338454620642),
-                                    ("integer (0..10)", -0.325422400434628)],
+                                   [("integer (numeric)", -1.3350010667323402),
+                                    ("integer (0..10)", -0.3794896217049037)],
                                n = 16},
                    koData =
-                     ClassData{prior = -0.3101549283038396,
-                               unseen = -3.8501476017100584,
+                     ClassData{prior = -0.2776317365982795,
+                               unseen = -3.9889840465642745,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -2.2192034840549946),
-                                    ("integer (0..10)", -0.11506932978478723)],
-                               n = 44}}),
+                                   [("integer (numeric)", -2.3608540011180215),
+                                    ("integer (0..10)", -0.28141245943818544),
+                                    ("<number>\20010/\20491", -1.890850371872286)],
+                               n = 50}}),
        ("nth <time> of <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
-                                    ("monthday", -0.7472144018302211),
+                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
+                                    ("monthday", -0.7308875085427924),
                                     ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.3350010667323402)],
-                               n = 8},
+                                     -1.0986122886681098)],
+                               n = 12},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (numeric with month symbol)",
         Classifier{okData =
-                     ClassData{prior = -0.13976194237515874,
-                               unseen = -3.7612001156935624,
+                     ClassData{prior = -0.10763066419236544,
+                               unseen = -3.891820298110627,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.0296194171811581),
-                                    ("integer (0..10)", -0.4418327522790392)],
-                               n = 40},
+                                   [("integer (numeric)", -1.1631508098056809),
+                                    ("number suffix: \21313", -2.2617630984737906),
+                                    ("integer (0..10)", -0.5753641449035618)],
+                               n = 44},
                    koData =
-                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                     ClassData{prior = -2.2823823856765264,
+                               unseen = -2.3025850929940455,
                                likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
-                               n = 6}}),
+                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
+                               n = 5}}),
        ("week (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8434293836092833,
@@ -451,12 +441,11 @@
                                n = 20}}),
        ("February",
         Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -2.833213344056216,
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 15},
                    koData =
-                     ClassData{prior = -2.772588722239781, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <cycle>",
         Classifier{okData =
                      ClassData{prior = -1.0185695809945732,
@@ -485,77 +474,75 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<dim time> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                     ClassData{prior = 0.0, unseen = -4.248495242049359,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -0.7514160886839211),
-                                    ("national dayevening|night", -2.871679624884012),
-                                    ("<named-month> <day-of-month>morning", -1.405342556090585),
-                                    ("children's dayafternoon", -2.871679624884012),
-                                    ("Mondaymorning", -1.7730673362159024)],
-                               n = 24},
+                                   [("dayhour", -0.7375989431307791),
+                                    ("national dayevening|night", -3.1354942159291497),
+                                    ("<named-month> <day-of-month>morning", -1.1895840668738362),
+                                    ("children's dayafternoon", -3.1354942159291497),
+                                    ("Mondaymorning", -2.03688192726104)],
+                               n = 32},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<part-of-day> <dim time>",
         Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.891820298110627,
+                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
                                likelihoods =
                                  HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
-                                    ("hourhour", -1.1631508098056809),
+                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
+                                    ("hourhour", -1.3523928094442093),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -2.0794415416798357),
-                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
-                                    ("hourminute", -1.9252908618525775),
+                                     -1.6625477377480489),
+                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
+                                    ("hourminute", -1.575536360758419),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -2.4849066497880004),
-                                    ("afternoonhh:mm (time-of-day)", -3.1780538303479458),
-                                    ("tonight<time-of-day> o'clock", -2.2617630984737906)],
-                               n = 20},
+                                     -2.6741486494265287),
+                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
+                               n = 25},
                    koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                     ClassData{prior = -0.7841189587656721,
+                               unseen = -3.9318256327243257,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourhour", -1.2039728043259361),
+                                   [("hourhour", -1.4271163556401458),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.8971199848858813),
-                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
-                                    ("hourminute", -1.8971199848858813),
+                                     -1.5141277326297755),
+                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
+                                    ("hourminute", -1.5141277326297755),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -1.742969305058623)],
-                               n = 16}}),
+                                     -1.9661128563728327)],
+                               n = 21}}),
        ("<integer> <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                     ClassData{prior = 0.0, unseen = -5.905361848054571,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.6560549059838294),
-                                    ("integer (0..10)month (grain)", -2.068268241081711),
-                                    ("integer (0..10)hour (grain)", -2.8304082931286074),
-                                    ("second", -3.235873401236772),
-                                    ("integer (0..10)day (grain)", -3.0417173867958143),
-                                    ("integer (0..10)year (grain)", -3.572345637857985),
-                                    ("integer (numeric)year (grain)", -3.1668805297498204),
-                                    ("integer (0..10)second (grain)", -3.235873401236772),
-                                    ("day", -3.0417173867958143), ("year", -2.6968769005040847),
-                                    ("integer (0..10)minute (grain)", -3.0417173867958143),
-                                    ("hour", -2.8304082931286074),
-                                    ("integer (0..10)week (grain)", -2.6560549059838294),
-                                    ("month", -1.7973932869463112),
-                                    ("integer (numeric)month (grain)", -3.1668805297498204),
-                                    ("minute", -3.0417173867958143)],
-                               n = 170}}),
-       ("integer (11..19)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                                   [("week", -2.6837575085331653),
+                                    ("integer (0..10)month (grain)", -2.535337503414892),
+                                    ("integer (0..10)hour (grain)", -3.06941998934515),
+                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
+                                    ("second", -3.2635760037861075),
+                                    ("integer (0..10)day (grain)", -3.06941998934515),
+                                    ("number suffix: \21313month (grain)", -4.293195420967266),
+                                    ("integer (0..10)year (grain)", -3.6000482404073204),
+                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
+                                    ("integer (numeric)year (grain)", -3.1945831322991562),
+                                    ("integer (0..10)second (grain)", -3.2635760037861075),
+                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
+                                    ("integer (0..10)minute (grain)", -3.06941998934515),
+                                    ("hour", -2.8581108956779433),
+                                    ("integer (0..10)week (grain)", -3.1945831322991562),
+                                    ("month", -1.7754989483562746),
+                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
+                                    ("integer (numeric)month (grain)", -3.1945831322991562),
+                                    ("minute", -3.06941998934515)],
+                               n = 173}}),
        ("<time-of-day> am|pm",
         Classifier{okData =
                      ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
@@ -575,21 +562,25 @@
                                n = 3}}),
        ("relative minutes after|past <integer> (hour-of-day)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (11..19)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5},
+                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.7801585575495751),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (0..10)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5}}),
+                                   [("<integer> (latent time-of-day)number suffix: \21313",
+                                     -1.3862943611198906),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.3862943611198906),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10}}),
        ("army's day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -599,21 +590,31 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by \",\"",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
-                                    ("dayday", -0.7576857016975165)],
-                               n = 14},
+                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
+                                    ("dayday", -0.7270487322356266)],
+                               n = 28},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
+                     ClassData{prior = -1.6094379124341003,
                                unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -0.8109302162163288),
                                     ("SundayFebruary", -0.8109302162163288)],
                                n = 7}}),
+       ("integer with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("second (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.70805020110221,
@@ -637,23 +638,21 @@
                                n = 20}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -1.2286654169163076,
+                               unseen = -3.4657359027997265,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
+                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
+                                    ("Tuesday", -1.6422277352570913)],
                                n = 12},
                    koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
+                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("month (numeric with month symbol)", -2.5649493574615367),
+                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
+                               n = 29}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -670,22 +669,22 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next <time>",
         Classifier{okData =
-                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                     ClassData{prior = -1.6486586255873816, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
                                    [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.24512245803298496,
-                               unseen = -3.784189633918261,
+                     ClassData{prior = -0.21357410029805904,
+                               unseen = -3.912023005428146,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Wednesday", -1.9694406464655074),
-                                    ("<integer> (latent time-of-day)", -1.1962507582320256),
-                                    ("month (numeric with month symbol)", -3.068052935133617),
-                                    ("day", -1.9694406464655074), ("hour", -1.1962507582320256),
-                                    ("month", -3.068052935133617)],
-                               n = 18}}),
+                                   [("Wednesday", -2.1000608288825715),
+                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
+                                    ("month (numeric with month symbol)", -3.1986731175506815),
+                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
+                                    ("month", -3.1986731175506815)],
+                               n = 21}}),
        ("last <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.8472978603872037,
@@ -722,24 +721,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.3877429013343523),
-                                    ("integer (0..10)month (grain)", -2.793208009442517),
-                                    ("integer (0..10)hour (grain)", -2.3877429013343523),
-                                    ("second", -2.793208009442517),
-                                    ("integer (0..10)day (grain)", -2.505525936990736),
-                                    ("integer (0..10)year (grain)", -3.1986731175506815),
-                                    ("integer (0..10)second (grain)", -2.793208009442517),
-                                    ("day", -2.505525936990736), ("year", -3.1986731175506815),
-                                    ("integer (0..10)minute (grain)", -2.639057329615259),
-                                    ("hour", -2.3877429013343523),
-                                    ("integer (0..10)week (grain)", -2.3877429013343523),
-                                    ("month", -2.793208009442517), ("minute", -2.639057329615259)],
+                                   [("week", -2.4079456086518722),
+                                    ("integer (0..10)hour (grain)", -2.659260036932778),
+                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
+                                    ("second", -2.8134107167600364),
+                                    ("integer (0..10)day (grain)", -2.5257286443082556),
+                                    ("integer (0..10)year (grain)", -3.2188758248682006),
+                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
+                                    ("integer (0..10)second (grain)", -2.8134107167600364),
+                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
+                                    ("integer (0..10)minute (grain)", -2.659260036932778),
+                                    ("hour", -2.4079456086518722),
+                                    ("integer (0..10)week (grain)", -2.995732273553991),
+                                    ("month", -2.8134107167600364),
+                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
+                                    ("minute", -2.659260036932778)],
                                n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Tuesday",
         Classifier{okData =
@@ -757,79 +759,95 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                     ClassData{prior = 0.0, unseen = -5.231108616854587,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Marchinteger (0..10)", -3.028522096376982),
-                                    ("Februaryinteger (11..19)", -2.6230569882688175),
-                                    ("month (numeric with month symbol)integer (11..19)",
-                                     -2.6230569882688175),
-                                    ("Marchinteger (numeric)", -3.721669276936927),
+                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Marchinteger (0..10)", -3.4339872044851463),
+                                    ("Marchinteger (numeric)", -4.127134385045092),
                                     ("month (numeric with month symbol)integer (numeric)",
-                                     -2.1122313645028266),
-                                    ("Februaryinteger (0..10)", -2.740840023925201),
-                                    ("month", -0.7427441216993174),
+                                     -2.517696472610991),
+                                    ("Februaryinteger (0..10)", -3.146305132033365),
+                                    ("month (numeric with month symbol)number suffix: \21313",
+                                     -3.146305132033365),
+                                    ("month", -0.7371103039810614),
                                     ("month (numeric with month symbol)integer (0..10)",
-                                     -2.1122313645028266)],
-                               n = 58},
+                                     -2.517696472610991),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
+                               n = 88},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (0..10)",
         Classifier{okData =
-                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                     ClassData{prior = -0.38372512147175847,
+                               unseen = -5.236441962829949,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
                    koData =
-                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+                     ClassData{prior = -1.143563676530376, unseen = -4.48863636973214,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 87}}),
        ("last n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.995732273553991),
-                                    ("integer (0..10)month (grain)", -2.120263536200091),
-                                    ("integer (0..10)hour (grain)", -2.4079456086518722),
-                                    ("second", -2.659260036932778),
-                                    ("integer (0..10)day (grain)", -2.995732273553991),
-                                    ("integer (0..10)year (grain)", -3.506557897319982),
-                                    ("integer (0..10)second (grain)", -2.659260036932778),
-                                    ("day", -2.995732273553991), ("year", -3.506557897319982),
-                                    ("integer (0..10)minute (grain)", -2.4079456086518722),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.120263536200091), ("minute", -2.4079456086518722)],
-                               n = 43},
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ordinal (digits)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 4},
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
+                               n = 4}}),
        ("n <cycle> last",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                     ClassData{prior = 0.0, unseen = -4.04305126783455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.379546134130174),
-                                    ("integer (0..10)month (grain)", -2.890371757896165),
-                                    ("integer (0..10)hour (grain)", -2.379546134130174),
-                                    ("second", -2.890371757896165),
-                                    ("integer (0..10)day (grain)", -2.379546134130174),
-                                    ("integer (0..10)year (grain)", -2.890371757896165),
-                                    ("integer (0..10)second (grain)", -2.890371757896165),
-                                    ("day", -2.379546134130174), ("year", -2.890371757896165),
-                                    ("integer (0..10)minute (grain)", -2.890371757896165),
-                                    ("hour", -2.379546134130174),
-                                    ("integer (0..10)week (grain)", -2.379546134130174),
-                                    ("month", -2.890371757896165), ("minute", -2.890371757896165)],
+                                   [("week", -2.4159137783010487),
+                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
+                                    ("second", -2.9267394020670396),
+                                    ("integer (0..10)day (grain)", -2.4159137783010487),
+                                    ("integer (0..10)year (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
+                                    ("integer (0..10)second (grain)", -2.9267394020670396),
+                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
+                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
+                                    ("hour", -2.4159137783010487),
+                                    ("integer (0..10)week (grain)", -2.9267394020670396),
+                                    ("month", -2.9267394020670396),
+                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
+                                    ("minute", -2.9267394020670396)],
                                n = 20},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("morning",
         Classifier{okData =
@@ -864,6 +882,13 @@
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
diff --git a/Duckling/Ranking/Classifiers/ZH_TW.hs b/Duckling/Ranking/Classifiers/ZH_TW.hs
--- a/Duckling/Ranking/Classifiers/ZH_TW.hs
+++ b/Duckling/Ranking/Classifiers/ZH_TW.hs
@@ -95,10 +95,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (grain)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                     ClassData{prior = -1.0076405104623831,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
                    koData =
-                     ClassData{prior = -0.4700036292457356,
+                     ClassData{prior = -0.45425527227759643,
                                unseen = -3.7376696182833684,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
        ("<time-of-day> o'clock",
@@ -124,6 +125,13 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
+       ("number suffix: \21313",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Wednesday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.9444389791664407,
@@ -140,44 +148,43 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                   [("children's day<part-of-day> <dim time>", -3.367295829986474),
                                     ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.5705980791178364),
-                                    ("dayday", -1.9070703157390494),
-                                    ("hourhour", -3.005682604407159),
-                                    ("hourminute", -3.5165082281731497),
+                                     -1.7578579175523736),
+                                    ("dayday", -1.6094379124341003),
+                                    ("hourhour", -3.367295829986474),
+                                    ("hourminute", -3.367295829986474),
                                     ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.9070703157390494),
-                                    ("dayminute", -3.5165082281731497),
-                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                     -1.6094379124341003),
+                                    ("dayminute", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.5165082281731497),
-                                    ("yearday", -1.5705980791178364)],
-                               n = 42},
+                                     -3.367295829986474),
+                                    ("yearday", -1.7578579175523736)],
+                               n = 64},
                    koData =
-                     ClassData{prior = -1.0388930539664873,
-                               unseen = -4.1588830833596715,
+                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -2.1972245773362196),
-                                    ("dayhour", -2.5336968139574325),
-                                    ("daymonth", -2.063693184711697),
-                                    ("year (numeric with year symbol)February", -3.044522437723423),
+                                   [("children's day<part-of-day> <dim time>", -2.065455299705096),
+                                    ("dayhour", -2.653241964607215),
+                                    ("daymonth", -2.1832383353614793),
+                                    ("year (numeric with year symbol)February", -3.164067588373206),
                                     ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.044522437723423),
-                                    ("hourhour", -3.044522437723423),
-                                    ("year (numeric with year symbol)March", -2.5336968139574325),
-                                    ("hourminute", -3.044522437723423),
-                                    ("yearmonth", -2.1972245773362196),
-                                    ("dayminute", -3.044522437723423),
+                                     -3.164067588373206),
+                                    ("hourhour", -3.164067588373206),
+                                    ("year (numeric with year symbol)March", -2.653241964607215),
+                                    ("hourminute", -2.653241964607215),
+                                    ("yearmonth", -2.316769727986002),
+                                    ("dayminute", -2.653241964607215),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.044522437723423),
+                                     -2.653241964607215),
                                     ("absorption of , after named dayFebruary",
-                                     -2.063693184711697)],
-                               n = 23}}),
+                                     -2.1832383353614793)],
+                               n = 27}}),
        ("year (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8209805520698302,
@@ -193,25 +200,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("last tuesday, last july",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.7472144018302211,
@@ -301,48 +289,50 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> (latent time-of-day)",
         Classifier{okData =
-                     ClassData{prior = -1.3217558399823195,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -1.4170660197866443, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.2809338454620642),
-                                    ("integer (0..10)", -0.325422400434628)],
+                                   [("integer (numeric)", -1.3350010667323402),
+                                    ("integer (0..10)", -0.3794896217049037)],
                                n = 16},
                    koData =
-                     ClassData{prior = -0.3101549283038396,
-                               unseen = -3.8501476017100584,
+                     ClassData{prior = -0.2776317365982795,
+                               unseen = -3.9889840465642745,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -2.2192034840549946),
-                                    ("integer (0..10)", -0.11506932978478723)],
-                               n = 44}}),
+                                   [("integer (numeric)", -2.3608540011180215),
+                                    ("integer (0..10)", -0.28141245943818544),
+                                    ("<number>\20010/\20491", -1.890850371872286)],
+                               n = 50}}),
        ("nth <time> of <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
-                                    ("monthday", -0.7472144018302211),
+                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
+                                    ("monthday", -0.7308875085427924),
                                     ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.3350010667323402)],
-                               n = 8},
+                                     -1.0986122886681098)],
+                               n = 12},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (numeric with month symbol)",
         Classifier{okData =
-                     ClassData{prior = -0.13976194237515874,
-                               unseen = -3.7612001156935624,
+                     ClassData{prior = -0.10763066419236544,
+                               unseen = -3.891820298110627,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.0296194171811581),
-                                    ("integer (0..10)", -0.4418327522790392)],
-                               n = 40},
+                                   [("integer (numeric)", -1.1631508098056809),
+                                    ("number suffix: \21313", -2.2617630984737906),
+                                    ("integer (0..10)", -0.5753641449035618)],
+                               n = 44},
                    koData =
-                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                     ClassData{prior = -2.2823823856765264,
+                               unseen = -2.3025850929940455,
                                likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
-                               n = 6}}),
+                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
+                               n = 5}}),
        ("week (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8434293836092833,
@@ -451,12 +441,11 @@
                                n = 20}}),
        ("February",
         Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -2.833213344056216,
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 15},
                    koData =
-                     ClassData{prior = -2.772588722239781, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <cycle>",
         Classifier{okData =
                      ClassData{prior = -1.0185695809945732,
@@ -485,77 +474,75 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<dim time> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.9889840465642745,
+                     ClassData{prior = 0.0, unseen = -4.248495242049359,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -0.7514160886839211),
-                                    ("national dayevening|night", -2.871679624884012),
-                                    ("<named-month> <day-of-month>morning", -1.405342556090585),
-                                    ("children's dayafternoon", -2.871679624884012),
-                                    ("Mondaymorning", -1.7730673362159024)],
-                               n = 24},
+                                   [("dayhour", -0.7375989431307791),
+                                    ("national dayevening|night", -3.1354942159291497),
+                                    ("<named-month> <day-of-month>morning", -1.1895840668738362),
+                                    ("children's dayafternoon", -3.1354942159291497),
+                                    ("Mondaymorning", -2.03688192726104)],
+                               n = 32},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.791759469228055,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<part-of-day> <dim time>",
         Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.891820298110627,
+                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
                                likelihoods =
                                  HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
-                                    ("hourhour", -1.1631508098056809),
+                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
+                                    ("hourhour", -1.3523928094442093),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -2.0794415416798357),
-                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
-                                    ("hourminute", -1.9252908618525775),
+                                     -1.6625477377480489),
+                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
+                                    ("hourminute", -1.575536360758419),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -2.4849066497880004),
-                                    ("afternoonhh:mm (time-of-day)", -3.1780538303479458),
-                                    ("tonight<time-of-day> o'clock", -2.2617630984737906)],
-                               n = 20},
+                                     -2.6741486494265287),
+                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
+                               n = 25},
                    koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                     ClassData{prior = -0.7841189587656721,
+                               unseen = -3.9318256327243257,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourhour", -1.2039728043259361),
+                                   [("hourhour", -1.4271163556401458),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.8971199848858813),
-                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
-                                    ("hourminute", -1.8971199848858813),
+                                     -1.5141277326297755),
+                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
+                                    ("hourminute", -1.5141277326297755),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -1.742969305058623)],
-                               n = 16}}),
+                                     -1.9661128563728327)],
+                               n = 21}}),
        ("<integer> <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                     ClassData{prior = 0.0, unseen = -5.905361848054571,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.6560549059838294),
-                                    ("integer (0..10)month (grain)", -2.068268241081711),
-                                    ("integer (0..10)hour (grain)", -2.8304082931286074),
-                                    ("second", -3.235873401236772),
-                                    ("integer (0..10)day (grain)", -3.0417173867958143),
-                                    ("integer (0..10)year (grain)", -3.572345637857985),
-                                    ("integer (numeric)year (grain)", -3.1668805297498204),
-                                    ("integer (0..10)second (grain)", -3.235873401236772),
-                                    ("day", -3.0417173867958143), ("year", -2.6968769005040847),
-                                    ("integer (0..10)minute (grain)", -3.0417173867958143),
-                                    ("hour", -2.8304082931286074),
-                                    ("integer (0..10)week (grain)", -2.6560549059838294),
-                                    ("month", -1.7973932869463112),
-                                    ("integer (numeric)month (grain)", -3.1668805297498204),
-                                    ("minute", -3.0417173867958143)],
-                               n = 170}}),
-       ("integer (11..19)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                                   [("week", -2.6837575085331653),
+                                    ("integer (0..10)month (grain)", -2.535337503414892),
+                                    ("integer (0..10)hour (grain)", -3.06941998934515),
+                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
+                                    ("second", -3.2635760037861075),
+                                    ("integer (0..10)day (grain)", -3.06941998934515),
+                                    ("number suffix: \21313month (grain)", -4.293195420967266),
+                                    ("integer (0..10)year (grain)", -3.6000482404073204),
+                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
+                                    ("integer (numeric)year (grain)", -3.1945831322991562),
+                                    ("integer (0..10)second (grain)", -3.2635760037861075),
+                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
+                                    ("integer (0..10)minute (grain)", -3.06941998934515),
+                                    ("hour", -2.8581108956779433),
+                                    ("integer (0..10)week (grain)", -3.1945831322991562),
+                                    ("month", -1.7754989483562746),
+                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
+                                    ("integer (numeric)month (grain)", -3.1945831322991562),
+                                    ("minute", -3.06941998934515)],
+                               n = 173}}),
        ("<time-of-day> am|pm",
         Classifier{okData =
                      ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
@@ -575,21 +562,25 @@
                                n = 3}}),
        ("relative minutes after|past <integer> (hour-of-day)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (11..19)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5},
+                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.7801585575495751),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (0..10)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5}}),
+                                   [("<integer> (latent time-of-day)number suffix: \21313",
+                                     -1.3862943611198906),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.3862943611198906),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10}}),
        ("army's day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -599,21 +590,31 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by \",\"",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
-                                    ("dayday", -0.7576857016975165)],
-                               n = 14},
+                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
+                                    ("dayday", -0.7270487322356266)],
+                               n = 28},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
+                     ClassData{prior = -1.6094379124341003,
                                unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -0.8109302162163288),
                                     ("SundayFebruary", -0.8109302162163288)],
                                n = 7}}),
+       ("integer with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("second (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.70805020110221,
@@ -637,23 +638,21 @@
                                n = 20}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -1.2286654169163076,
+                               unseen = -3.4657359027997265,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
+                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
+                                    ("Tuesday", -1.6422277352570913)],
                                n = 12},
                    koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
+                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("month (numeric with month symbol)", -2.5649493574615367),
+                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
+                               n = 29}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -670,22 +669,22 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next <time>",
         Classifier{okData =
-                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                     ClassData{prior = -1.6486586255873816, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
                                    [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.24512245803298496,
-                               unseen = -3.784189633918261,
+                     ClassData{prior = -0.21357410029805904,
+                               unseen = -3.912023005428146,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Wednesday", -1.9694406464655074),
-                                    ("<integer> (latent time-of-day)", -1.1962507582320256),
-                                    ("month (numeric with month symbol)", -3.068052935133617),
-                                    ("day", -1.9694406464655074), ("hour", -1.1962507582320256),
-                                    ("month", -3.068052935133617)],
-                               n = 18}}),
+                                   [("Wednesday", -2.1000608288825715),
+                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
+                                    ("month (numeric with month symbol)", -3.1986731175506815),
+                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
+                                    ("month", -3.1986731175506815)],
+                               n = 21}}),
        ("last <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.8472978603872037,
@@ -722,24 +721,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.3877429013343523),
-                                    ("integer (0..10)month (grain)", -2.793208009442517),
-                                    ("integer (0..10)hour (grain)", -2.3877429013343523),
-                                    ("second", -2.793208009442517),
-                                    ("integer (0..10)day (grain)", -2.505525936990736),
-                                    ("integer (0..10)year (grain)", -3.1986731175506815),
-                                    ("integer (0..10)second (grain)", -2.793208009442517),
-                                    ("day", -2.505525936990736), ("year", -3.1986731175506815),
-                                    ("integer (0..10)minute (grain)", -2.639057329615259),
-                                    ("hour", -2.3877429013343523),
-                                    ("integer (0..10)week (grain)", -2.3877429013343523),
-                                    ("month", -2.793208009442517), ("minute", -2.639057329615259)],
+                                   [("week", -2.4079456086518722),
+                                    ("integer (0..10)hour (grain)", -2.659260036932778),
+                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
+                                    ("second", -2.8134107167600364),
+                                    ("integer (0..10)day (grain)", -2.5257286443082556),
+                                    ("integer (0..10)year (grain)", -3.2188758248682006),
+                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
+                                    ("integer (0..10)second (grain)", -2.8134107167600364),
+                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
+                                    ("integer (0..10)minute (grain)", -2.659260036932778),
+                                    ("hour", -2.4079456086518722),
+                                    ("integer (0..10)week (grain)", -2.995732273553991),
+                                    ("month", -2.8134107167600364),
+                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
+                                    ("minute", -2.659260036932778)],
                                n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Tuesday",
         Classifier{okData =
@@ -757,79 +759,95 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                     ClassData{prior = 0.0, unseen = -5.231108616854587,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Marchinteger (0..10)", -3.028522096376982),
-                                    ("Februaryinteger (11..19)", -2.6230569882688175),
-                                    ("month (numeric with month symbol)integer (11..19)",
-                                     -2.6230569882688175),
-                                    ("Marchinteger (numeric)", -3.721669276936927),
+                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Marchinteger (0..10)", -3.4339872044851463),
+                                    ("Marchinteger (numeric)", -4.127134385045092),
                                     ("month (numeric with month symbol)integer (numeric)",
-                                     -2.1122313645028266),
-                                    ("Februaryinteger (0..10)", -2.740840023925201),
-                                    ("month", -0.7427441216993174),
+                                     -2.517696472610991),
+                                    ("Februaryinteger (0..10)", -3.146305132033365),
+                                    ("month (numeric with month symbol)number suffix: \21313",
+                                     -3.146305132033365),
+                                    ("month", -0.7371103039810614),
                                     ("month (numeric with month symbol)integer (0..10)",
-                                     -2.1122313645028266)],
-                               n = 58},
+                                     -2.517696472610991),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
+                               n = 88},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (0..10)",
         Classifier{okData =
-                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                     ClassData{prior = -0.38372512147175847,
+                               unseen = -5.236441962829949,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
                    koData =
-                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+                     ClassData{prior = -1.143563676530376, unseen = -4.48863636973214,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 87}}),
        ("last n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.995732273553991),
-                                    ("integer (0..10)month (grain)", -2.120263536200091),
-                                    ("integer (0..10)hour (grain)", -2.4079456086518722),
-                                    ("second", -2.659260036932778),
-                                    ("integer (0..10)day (grain)", -2.995732273553991),
-                                    ("integer (0..10)year (grain)", -3.506557897319982),
-                                    ("integer (0..10)second (grain)", -2.659260036932778),
-                                    ("day", -2.995732273553991), ("year", -3.506557897319982),
-                                    ("integer (0..10)minute (grain)", -2.4079456086518722),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.120263536200091), ("minute", -2.4079456086518722)],
-                               n = 43},
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ordinal (digits)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 4},
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
+                               n = 4}}),
        ("n <cycle> last",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                     ClassData{prior = 0.0, unseen = -4.04305126783455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.379546134130174),
-                                    ("integer (0..10)month (grain)", -2.890371757896165),
-                                    ("integer (0..10)hour (grain)", -2.379546134130174),
-                                    ("second", -2.890371757896165),
-                                    ("integer (0..10)day (grain)", -2.379546134130174),
-                                    ("integer (0..10)year (grain)", -2.890371757896165),
-                                    ("integer (0..10)second (grain)", -2.890371757896165),
-                                    ("day", -2.379546134130174), ("year", -2.890371757896165),
-                                    ("integer (0..10)minute (grain)", -2.890371757896165),
-                                    ("hour", -2.379546134130174),
-                                    ("integer (0..10)week (grain)", -2.379546134130174),
-                                    ("month", -2.890371757896165), ("minute", -2.890371757896165)],
+                                   [("week", -2.4159137783010487),
+                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
+                                    ("second", -2.9267394020670396),
+                                    ("integer (0..10)day (grain)", -2.4159137783010487),
+                                    ("integer (0..10)year (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
+                                    ("integer (0..10)second (grain)", -2.9267394020670396),
+                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
+                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
+                                    ("hour", -2.4159137783010487),
+                                    ("integer (0..10)week (grain)", -2.9267394020670396),
+                                    ("month", -2.9267394020670396),
+                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
+                                    ("minute", -2.9267394020670396)],
                                n = 20},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("morning",
         Classifier{okData =
@@ -864,6 +882,13 @@
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
diff --git a/Duckling/Ranking/Classifiers/ZH_XX.hs b/Duckling/Ranking/Classifiers/ZH_XX.hs
--- a/Duckling/Ranking/Classifiers/ZH_XX.hs
+++ b/Duckling/Ranking/Classifiers/ZH_XX.hs
@@ -95,10 +95,11 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (grain)",
         Classifier{okData =
-                     ClassData{prior = -0.9808292530117262, unseen = -3.258096538021482,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                     ClassData{prior = -1.0076405104623831,
+                               unseen = -3.2188758248682006,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 23},
                    koData =
-                     ClassData{prior = -0.4700036292457356,
+                     ClassData{prior = -0.45425527227759643,
                                unseen = -3.7376696182833684,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 40}}),
        ("<time-of-day> o'clock",
@@ -117,6 +118,13 @@
                                    [("<integer> (latent time-of-day)", -0.6931471805599453),
                                     ("hour", -0.6931471805599453)],
                                n = 5}}),
+       ("number suffix: \21313",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.258096538021482,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 24},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("Wednesday",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.9444389791664407,
@@ -133,44 +141,43 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect",
         Classifier{okData =
-                     ClassData{prior = -0.4367176516122688, unseen = -4.624972813284271,
+                     ClassData{prior = -0.3519764231571781, unseen = -4.983606621708336,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -3.5165082281731497),
+                                   [("children's day<part-of-day> <dim time>", -3.367295829986474),
                                     ("year (numeric with year symbol)<named-month> <day-of-month>",
-                                     -1.5705980791178364),
-                                    ("dayday", -1.9070703157390494),
-                                    ("hourhour", -3.005682604407159),
-                                    ("hourminute", -3.5165082281731497),
+                                     -1.7578579175523736),
+                                    ("dayday", -1.6094379124341003),
+                                    ("hourhour", -3.367295829986474),
+                                    ("hourminute", -3.367295829986474),
                                     ("absorption of , after named day<named-month> <day-of-month>",
-                                     -1.9070703157390494),
-                                    ("dayminute", -3.5165082281731497),
-                                    ("tonight<time-of-day> o'clock", -3.005682604407159),
+                                     -1.6094379124341003),
+                                    ("dayminute", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -3.367295829986474),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.5165082281731497),
-                                    ("yearday", -1.5705980791178364)],
-                               n = 42},
+                                     -3.367295829986474),
+                                    ("yearday", -1.7578579175523736)],
+                               n = 64},
                    koData =
-                     ClassData{prior = -1.0388930539664873,
-                               unseen = -4.1588830833596715,
+                     ClassData{prior = -1.215022640512521, unseen = -4.276666119016055,
                                likelihoods =
                                  HashMap.fromList
-                                   [("children's day<part-of-day> <dim time>", -2.1972245773362196),
-                                    ("dayhour", -2.5336968139574325),
-                                    ("daymonth", -2.063693184711697),
-                                    ("year (numeric with year symbol)February", -3.044522437723423),
+                                   [("children's day<part-of-day> <dim time>", -2.065455299705096),
+                                    ("dayhour", -2.653241964607215),
+                                    ("daymonth", -2.1832383353614793),
+                                    ("year (numeric with year symbol)February", -3.164067588373206),
                                     ("<dim time> <part-of-day><time-of-day> o'clock",
-                                     -3.044522437723423),
-                                    ("hourhour", -3.044522437723423),
-                                    ("year (numeric with year symbol)March", -2.5336968139574325),
-                                    ("hourminute", -3.044522437723423),
-                                    ("yearmonth", -2.1972245773362196),
-                                    ("dayminute", -3.044522437723423),
+                                     -3.164067588373206),
+                                    ("hourhour", -3.164067588373206),
+                                    ("year (numeric with year symbol)March", -2.653241964607215),
+                                    ("hourminute", -2.653241964607215),
+                                    ("yearmonth", -2.316769727986002),
+                                    ("dayminute", -2.653241964607215),
                                     ("<dim time> <part-of-day>relative minutes after|past <integer> (hour-of-day)",
-                                     -3.044522437723423),
+                                     -2.653241964607215),
                                     ("absorption of , after named dayFebruary",
-                                     -2.063693184711697)],
-                               n = 23}}),
+                                     -2.1832383353614793)],
+                               n = 27}}),
        ("year (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8209805520698302,
@@ -186,25 +193,6 @@
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
-       ("last tuesday, last july",
-        Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
-                               n = 12},
-                   koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
-                               likelihoods =
-                                 HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
        ("next <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.7472144018302211,
@@ -287,48 +275,50 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<integer> (latent time-of-day)",
         Classifier{okData =
-                     ClassData{prior = -1.3217558399823195,
-                               unseen = -2.9444389791664407,
+                     ClassData{prior = -1.4170660197866443, unseen = -2.995732273553991,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.2809338454620642),
-                                    ("integer (0..10)", -0.325422400434628)],
+                                   [("integer (numeric)", -1.3350010667323402),
+                                    ("integer (0..10)", -0.3794896217049037)],
                                n = 16},
                    koData =
-                     ClassData{prior = -0.3101549283038396,
-                               unseen = -3.8501476017100584,
+                     ClassData{prior = -0.2776317365982795,
+                               unseen = -3.9889840465642745,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -2.2192034840549946),
-                                    ("integer (0..10)", -0.11506932978478723)],
-                               n = 44}}),
+                                   [("integer (numeric)", -2.3608540011180215),
+                                    ("integer (0..10)", -0.28141245943818544),
+                                    ("<number>\20010/\20491", -1.890850371872286)],
+                               n = 50}}),
        ("nth <time> of <time>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.995732273553991,
+                     ClassData{prior = 0.0, unseen = -3.332204510175204,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Octoberordinal (digits)Monday", -1.3350010667323402),
-                                    ("monthday", -0.7472144018302211),
+                                   [("Octoberordinal (digits)Monday", -1.6863989535702288),
+                                    ("monthday", -0.7308875085427924),
                                     ("month (numeric with month symbol)ordinal (digits)Monday",
-                                     -1.3350010667323402)],
-                               n = 8},
+                                     -1.0986122886681098)],
+                               n = 12},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("month (numeric with month symbol)",
         Classifier{okData =
-                     ClassData{prior = -0.13976194237515874,
-                               unseen = -3.7612001156935624,
+                     ClassData{prior = -0.10763066419236544,
+                               unseen = -3.891820298110627,
                                likelihoods =
                                  HashMap.fromList
-                                   [("integer (numeric)", -1.0296194171811581),
-                                    ("integer (0..10)", -0.4418327522790392)],
-                               n = 40},
+                                   [("integer (numeric)", -1.1631508098056809),
+                                    ("number suffix: \21313", -2.2617630984737906),
+                                    ("integer (0..10)", -0.5753641449035618)],
+                               n = 44},
                    koData =
-                     ClassData{prior = -2.03688192726104, unseen = -2.1972245773362196,
+                     ClassData{prior = -2.2823823856765264,
+                               unseen = -2.3025850929940455,
                                likelihoods =
-                                 HashMap.fromList [("integer (0..10)", -0.13353139262452263)],
-                               n = 6}}),
+                                 HashMap.fromList [("<number>\20010/\20491", -0.40546510810816444)],
+                               n = 5}}),
        ("week (grain)",
         Classifier{okData =
                      ClassData{prior = -0.8434293836092833,
@@ -437,12 +427,11 @@
                                n = 20}}),
        ("February",
         Classifier{okData =
-                     ClassData{prior = -6.453852113757118e-2,
-                               unseen = -2.833213344056216,
+                     ClassData{prior = 0.0, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 15},
                    koData =
-                     ClassData{prior = -2.772588722239781, unseen = -1.0986122886681098,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 1}}),
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("this <cycle>",
         Classifier{okData =
                      ClassData{prior = -1.0185695809945732,
@@ -471,76 +460,74 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<dim time> <part-of-day>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -3.891820298110627,
+                     ClassData{prior = 0.0, unseen = -4.174387269895637,
                                likelihoods =
                                  HashMap.fromList
-                                   [("dayhour", -0.7357067949787413),
-                                    ("<named-month> <day-of-month>morning", -1.3062516534463542),
-                                    ("children's dayafternoon", -2.772588722239781),
-                                    ("Mondaymorning", -1.6739764335716716)],
-                               n = 22},
+                                   [("dayhour", -0.7248958788745256),
+                                    ("<named-month> <day-of-month>morning", -1.114360645636249),
+                                    ("children's dayafternoon", -3.0602707946915624),
+                                    ("Mondaymorning", -1.9616585060234524)],
+                               n = 30},
                    koData =
                      ClassData{prior = -infinity, unseen = -1.6094379124341003,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<part-of-day> <dim time>",
         Classifier{okData =
-                     ClassData{prior = -0.587786664902119, unseen = -3.891820298110627,
+                     ClassData{prior = -0.6097655716208943, unseen = -4.07753744390572,
                                likelihoods =
                                  HashMap.fromList
-                                   [("tonight<integer> (latent time-of-day)", -2.2617630984737906),
-                                    ("hourhour", -1.1631508098056809),
+                                   [("tonight<integer> (latent time-of-day)", -2.451005098112319),
+                                    ("hourhour", -1.3523928094442093),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -2.0794415416798357),
-                                    ("afternoon<time-of-day> o'clock", -2.4849066497880004),
-                                    ("hourminute", -1.9252908618525775),
+                                     -1.6625477377480489),
+                                    ("afternoon<time-of-day> o'clock", -2.6741486494265287),
+                                    ("hourminute", -1.575536360758419),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -2.4849066497880004),
-                                    ("afternoonhh:mm (time-of-day)", -3.1780538303479458),
-                                    ("tonight<time-of-day> o'clock", -2.2617630984737906)],
-                               n = 20},
+                                     -2.6741486494265287),
+                                    ("afternoonhh:mm (time-of-day)", -3.367295829986474),
+                                    ("tonight<time-of-day> o'clock", -2.451005098112319)],
+                               n = 25},
                    koData =
-                     ClassData{prior = -0.8109302162163288, unseen = -3.713572066704308,
+                     ClassData{prior = -0.7841189587656721,
+                               unseen = -3.9318256327243257,
                                likelihoods =
                                  HashMap.fromList
-                                   [("hourhour", -1.2039728043259361),
+                                   [("hourhour", -1.4271163556401458),
                                     ("afternoonrelative minutes after|past <integer> (hour-of-day)",
-                                     -1.8971199848858813),
-                                    ("afternoon<time-of-day> o'clock", -1.8971199848858813),
-                                    ("hourminute", -1.8971199848858813),
+                                     -1.5141277326297755),
+                                    ("afternoon<time-of-day> o'clock", -2.120263536200091),
+                                    ("hourminute", -1.5141277326297755),
                                     ("afternoon<integer> (latent time-of-day)",
-                                     -1.742969305058623)],
-                               n = 16}}),
+                                     -1.9661128563728327)],
+                               n = 21}}),
        ("<integer> <unit-of-duration>",
         Classifier{okData =
-                     ClassData{prior = -infinity, unseen = -2.833213344056216,
+                     ClassData{prior = -infinity, unseen = -3.044522437723423,
                                likelihoods = HashMap.fromList [], n = 0},
                    koData =
-                     ClassData{prior = 0.0, unseen = -5.877735781779639,
+                     ClassData{prior = 0.0, unseen = -5.905361848054571,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.6560549059838294),
-                                    ("integer (0..10)month (grain)", -2.068268241081711),
-                                    ("integer (0..10)hour (grain)", -2.8304082931286074),
-                                    ("second", -3.235873401236772),
-                                    ("integer (0..10)day (grain)", -3.0417173867958143),
-                                    ("integer (0..10)year (grain)", -3.572345637857985),
-                                    ("integer (numeric)year (grain)", -3.1668805297498204),
-                                    ("integer (0..10)second (grain)", -3.235873401236772),
-                                    ("day", -3.0417173867958143), ("year", -2.6968769005040847),
-                                    ("integer (0..10)minute (grain)", -3.0417173867958143),
-                                    ("hour", -2.8304082931286074),
-                                    ("integer (0..10)week (grain)", -2.6560549059838294),
-                                    ("month", -1.7973932869463112),
-                                    ("integer (numeric)month (grain)", -3.1668805297498204),
-                                    ("minute", -3.0417173867958143)],
-                               n = 170}}),
-       ("integer (11..19)",
-        Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -2.70805020110221,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 13},
-                   koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                                   [("week", -2.6837575085331653),
+                                    ("integer (0..10)month (grain)", -2.535337503414892),
+                                    ("integer (0..10)hour (grain)", -3.06941998934515),
+                                    ("<number>\20010/\20491week (grain)", -3.5047380606029956),
+                                    ("second", -3.2635760037861075),
+                                    ("integer (0..10)day (grain)", -3.06941998934515),
+                                    ("number suffix: \21313month (grain)", -4.293195420967266),
+                                    ("integer (0..10)year (grain)", -3.6000482404073204),
+                                    ("<number>\20010/\20491month (grain)", -3.130044611161585),
+                                    ("integer (numeric)year (grain)", -3.1945831322991562),
+                                    ("integer (0..10)second (grain)", -3.2635760037861075),
+                                    ("day", -3.06941998934515), ("year", -2.7245795030534206),
+                                    ("integer (0..10)minute (grain)", -3.06941998934515),
+                                    ("hour", -2.8581108956779433),
+                                    ("integer (0..10)week (grain)", -3.1945831322991562),
+                                    ("month", -1.7754989483562746),
+                                    ("<number>\20010/\20491hour (grain)", -4.293195420967266),
+                                    ("integer (numeric)month (grain)", -3.1945831322991562),
+                                    ("minute", -3.06941998934515)],
+                               n = 173}}),
        ("<time-of-day> am|pm",
         Classifier{okData =
                      ClassData{prior = -0.4700036292457356, unseen = -2.70805020110221,
@@ -560,21 +547,25 @@
                                n = 3}}),
        ("relative minutes after|past <integer> (hour-of-day)",
         Classifier{okData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (11..19)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5},
+                                   [("<integer> (latent time-of-day)integer with consecutive unit modifiers",
+                                     -0.7801585575495751),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10},
                    koData =
-                     ClassData{prior = -0.6931471805599453, unseen = -2.639057329615259,
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -3.2188758248682006,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)integer (0..10)",
-                                     -0.7731898882334817),
-                                    ("hour", -0.7731898882334817)],
-                               n = 5}}),
+                                   [("<integer> (latent time-of-day)number suffix: \21313",
+                                     -1.3862943611198906),
+                                    ("<integer> (latent time-of-day)integer (0..10)",
+                                     -1.3862943611198906),
+                                    ("hour", -0.7801585575495751)],
+                               n = 10}}),
        ("army's day",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
@@ -584,21 +575,31 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("intersect by \",\"",
         Classifier{okData =
-                     ClassData{prior = -0.40546510810816444,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -0.2231435513142097, unseen = -4.110873864173311,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Sunday<named-month> <day-of-month>", -0.7576857016975165),
-                                    ("dayday", -0.7576857016975165)],
-                               n = 14},
+                                   [("Sunday<named-month> <day-of-month>", -0.7270487322356266),
+                                    ("dayday", -0.7270487322356266)],
+                               n = 28},
                    koData =
-                     ClassData{prior = -1.0986122886681098,
+                     ClassData{prior = -1.6094379124341003,
                                unseen = -2.9444389791664407,
                                likelihoods =
                                  HashMap.fromList
                                    [("daymonth", -0.8109302162163288),
                                     ("SundayFebruary", -0.8109302162163288)],
                                n = 7}}),
+       ("integer with consecutive unit modifiers",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.367295829986474,
+                               likelihoods =
+                                 HashMap.fromList
+                                   [("number suffix: \21313integer (0..10)", -0.6931471805599453),
+                                    ("integer (0..10)integer (0..10)", -0.6931471805599453)],
+                               n = 26},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -1.0986122886681098,
+                               likelihoods = HashMap.fromList [], n = 0}}),
        ("second (grain)",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.70805020110221,
@@ -622,23 +623,21 @@
                                n = 20}}),
        ("last <time>",
         Classifier{okData =
-                     ClassData{prior = -1.2039728043259361,
-                               unseen = -3.4965075614664802,
+                     ClassData{prior = -1.2286654169163076,
+                               unseen = -3.4657359027997265,
                                likelihoods =
                                  HashMap.fromList
-                                   [("day", -0.9007865453381898), ("Sunday", -1.3862943611198906),
-                                    ("Tuesday", -1.6739764335716716)],
+                                   [("day", -0.8690378470236094), ("Sunday", -1.3545456628053103),
+                                    ("Tuesday", -1.6422277352570913)],
                                n = 12},
                    koData =
-                     ClassData{prior = -0.35667494393873245,
-                               unseen = -4.174387269895637,
+                     ClassData{prior = -0.3462762367178338, unseen = -4.189654742026425,
                                likelihoods =
                                  HashMap.fromList
-                                   [("<integer> (latent time-of-day)", -1.0233888674305223),
-                                    ("month (numeric with month symbol)", -2.367123614131617),
-                                    ("February", -3.4657359027997265),
-                                    ("hour", -1.0233888674305223), ("month", -2.2129729343043585)],
-                               n = 28}}),
+                                   [("<integer> (latent time-of-day)", -0.916290731874155),
+                                    ("month (numeric with month symbol)", -2.5649493574615367),
+                                    ("hour", -0.916290731874155), ("month", -2.5649493574615367)],
+                               n = 29}}),
        ("March",
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -2.1972245773362196,
@@ -655,22 +654,22 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next <time>",
         Classifier{okData =
-                     ClassData{prior = -1.5260563034950494, unseen = -2.890371757896165,
+                     ClassData{prior = -1.6486586255873816, unseen = -2.890371757896165,
                                likelihoods =
                                  HashMap.fromList
                                    [("day", -1.041453874828161), ("Tuesday", -1.041453874828161)],
                                n = 5},
                    koData =
-                     ClassData{prior = -0.24512245803298496,
-                               unseen = -3.784189633918261,
+                     ClassData{prior = -0.21357410029805904,
+                               unseen = -3.912023005428146,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Wednesday", -1.9694406464655074),
-                                    ("<integer> (latent time-of-day)", -1.1962507582320256),
-                                    ("month (numeric with month symbol)", -3.068052935133617),
-                                    ("day", -1.9694406464655074), ("hour", -1.1962507582320256),
-                                    ("month", -3.068052935133617)],
-                               n = 18}}),
+                                   [("Wednesday", -2.1000608288825715),
+                                    ("<integer> (latent time-of-day)", -1.1192315758708455),
+                                    ("month (numeric with month symbol)", -3.1986731175506815),
+                                    ("day", -2.1000608288825715), ("hour", -1.1192315758708455),
+                                    ("month", -3.1986731175506815)],
+                               n = 21}}),
        ("last <cycle>",
         Classifier{okData =
                      ClassData{prior = -0.8472978603872037,
@@ -707,24 +706,27 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("next n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.59511985013459,
+                     ClassData{prior = 0.0, unseen = -4.61512051684126,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.3877429013343523),
-                                    ("integer (0..10)month (grain)", -2.793208009442517),
-                                    ("integer (0..10)hour (grain)", -2.3877429013343523),
-                                    ("second", -2.793208009442517),
-                                    ("integer (0..10)day (grain)", -2.505525936990736),
-                                    ("integer (0..10)year (grain)", -3.1986731175506815),
-                                    ("integer (0..10)second (grain)", -2.793208009442517),
-                                    ("day", -2.505525936990736), ("year", -3.1986731175506815),
-                                    ("integer (0..10)minute (grain)", -2.639057329615259),
-                                    ("hour", -2.3877429013343523),
-                                    ("integer (0..10)week (grain)", -2.3877429013343523),
-                                    ("month", -2.793208009442517), ("minute", -2.639057329615259)],
+                                   [("week", -2.4079456086518722),
+                                    ("integer (0..10)hour (grain)", -2.659260036932778),
+                                    ("<number>\20010/\20491week (grain)", -2.995732273553991),
+                                    ("second", -2.8134107167600364),
+                                    ("integer (0..10)day (grain)", -2.5257286443082556),
+                                    ("integer (0..10)year (grain)", -3.2188758248682006),
+                                    ("<number>\20010/\20491month (grain)", -2.8134107167600364),
+                                    ("integer (0..10)second (grain)", -2.8134107167600364),
+                                    ("day", -2.5257286443082556), ("year", -3.2188758248682006),
+                                    ("integer (0..10)minute (grain)", -2.659260036932778),
+                                    ("hour", -2.4079456086518722),
+                                    ("integer (0..10)week (grain)", -2.995732273553991),
+                                    ("month", -2.8134107167600364),
+                                    ("<number>\20010/\20491hour (grain)", -3.506557897319982),
+                                    ("minute", -2.659260036932778)],
                                n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("Tuesday",
         Classifier{okData =
@@ -742,79 +744,95 @@
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("<named-month> <day-of-month>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.8283137373023015,
+                     ClassData{prior = 0.0, unseen = -5.231108616854587,
                                likelihoods =
                                  HashMap.fromList
-                                   [("Marchinteger (0..10)", -3.028522096376982),
-                                    ("Februaryinteger (11..19)", -2.6230569882688175),
-                                    ("month (numeric with month symbol)integer (11..19)",
-                                     -2.6230569882688175),
-                                    ("Marchinteger (numeric)", -3.721669276936927),
+                                   [("month (numeric with month symbol)integer with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Marchinteger (0..10)", -3.4339872044851463),
+                                    ("Marchinteger (numeric)", -4.127134385045092),
                                     ("month (numeric with month symbol)integer (numeric)",
-                                     -2.1122313645028266),
-                                    ("Februaryinteger (0..10)", -2.740840023925201),
-                                    ("month", -0.7427441216993174),
+                                     -2.517696472610991),
+                                    ("Februaryinteger (0..10)", -3.146305132033365),
+                                    ("month (numeric with month symbol)number suffix: \21313",
+                                     -3.146305132033365),
+                                    ("month", -0.7371103039810614),
                                     ("month (numeric with month symbol)integer (0..10)",
-                                     -2.1122313645028266)],
-                               n = 58},
+                                     -2.517696472610991),
+                                    ("Februaryinteger with consecutive unit modifiers",
+                                     -2.392533329656985),
+                                    ("Februarynumber suffix: \21313", -3.146305132033365)],
+                               n = 88},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.1972245773362196,
+                     ClassData{prior = -infinity, unseen = -2.3978952727983707,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("integer (0..10)",
         Classifier{okData =
-                     ClassData{prior = -0.4540728071735412, unseen = -5.170483995038151,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 174},
+                     ClassData{prior = -0.38372512147175847,
+                               unseen = -5.236441962829949,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 186},
                    koData =
-                     ClassData{prior = -1.007957920399979, unseen = -4.624972813284271,
-                               likelihoods = HashMap.fromList [("", 0.0)], n = 100}}),
+                     ClassData{prior = -1.143563676530376, unseen = -4.48863636973214,
+                               likelihoods = HashMap.fromList [("", 0.0)], n = 87}}),
        ("last n <cycle>",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.61512051684126,
+                     ClassData{prior = 0.0, unseen = -4.605170185988091,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.995732273553991),
-                                    ("integer (0..10)month (grain)", -2.120263536200091),
-                                    ("integer (0..10)hour (grain)", -2.4079456086518722),
-                                    ("second", -2.659260036932778),
-                                    ("integer (0..10)day (grain)", -2.995732273553991),
-                                    ("integer (0..10)year (grain)", -3.506557897319982),
-                                    ("integer (0..10)second (grain)", -2.659260036932778),
-                                    ("day", -2.995732273553991), ("year", -3.506557897319982),
-                                    ("integer (0..10)minute (grain)", -2.4079456086518722),
-                                    ("hour", -2.4079456086518722),
-                                    ("integer (0..10)week (grain)", -2.995732273553991),
-                                    ("month", -2.120263536200091), ("minute", -2.4079456086518722)],
-                               n = 43},
+                                   [("week", -2.9856819377004897),
+                                    ("integer (0..10)month (grain)", -3.4965075614664802),
+                                    ("integer (0..10)hour (grain)", -2.3978952727983707),
+                                    ("second", -2.649209701079277),
+                                    ("integer (0..10)day (grain)", -2.9856819377004897),
+                                    ("integer (0..10)year (grain)", -3.4965075614664802),
+                                    ("<number>\20010/\20491month (grain)", -2.3978952727983707),
+                                    ("integer (0..10)second (grain)", -2.649209701079277),
+                                    ("day", -2.9856819377004897), ("year", -3.4965075614664802),
+                                    ("integer (0..10)minute (grain)", -2.3978952727983707),
+                                    ("hour", -2.3978952727983707),
+                                    ("integer (0..10)week (grain)", -2.9856819377004897),
+                                    ("month", -2.1972245773362196),
+                                    ("minute", -2.3978952727983707)],
+                               n = 42},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.772588722239781,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("ordinal (digits)",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -1.791759469228055,
-                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 4},
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("<number>\20010/\20491", -0.1823215567939546)],
+                               n = 4},
                    koData =
-                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
-                               likelihoods = HashMap.fromList [], n = 0}}),
+                     ClassData{prior = -0.6931471805599453,
+                               unseen = -1.9459101490553135,
+                               likelihoods =
+                                 HashMap.fromList [("integer (0..10)", -0.1823215567939546)],
+                               n = 4}}),
        ("n <cycle> last",
         Classifier{okData =
-                     ClassData{prior = 0.0, unseen = -4.007333185232471,
+                     ClassData{prior = 0.0, unseen = -4.04305126783455,
                                likelihoods =
                                  HashMap.fromList
-                                   [("week", -2.379546134130174),
-                                    ("integer (0..10)month (grain)", -2.890371757896165),
-                                    ("integer (0..10)hour (grain)", -2.379546134130174),
-                                    ("second", -2.890371757896165),
-                                    ("integer (0..10)day (grain)", -2.379546134130174),
-                                    ("integer (0..10)year (grain)", -2.890371757896165),
-                                    ("integer (0..10)second (grain)", -2.890371757896165),
-                                    ("day", -2.379546134130174), ("year", -2.890371757896165),
-                                    ("integer (0..10)minute (grain)", -2.890371757896165),
-                                    ("hour", -2.379546134130174),
-                                    ("integer (0..10)week (grain)", -2.379546134130174),
-                                    ("month", -2.890371757896165), ("minute", -2.890371757896165)],
+                                   [("week", -2.4159137783010487),
+                                    ("integer (0..10)hour (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491week (grain)", -2.9267394020670396),
+                                    ("second", -2.9267394020670396),
+                                    ("integer (0..10)day (grain)", -2.4159137783010487),
+                                    ("integer (0..10)year (grain)", -2.9267394020670396),
+                                    ("<number>\20010/\20491month (grain)", -2.9267394020670396),
+                                    ("integer (0..10)second (grain)", -2.9267394020670396),
+                                    ("day", -2.4159137783010487), ("year", -2.9267394020670396),
+                                    ("integer (0..10)minute (grain)", -2.9267394020670396),
+                                    ("hour", -2.4159137783010487),
+                                    ("integer (0..10)week (grain)", -2.9267394020670396),
+                                    ("month", -2.9267394020670396),
+                                    ("<number>\20010/\20491hour (grain)", -2.9267394020670396),
+                                    ("minute", -2.9267394020670396)],
                                n = 20},
                    koData =
-                     ClassData{prior = -infinity, unseen = -2.70805020110221,
+                     ClassData{prior = -infinity, unseen = -2.833213344056216,
                                likelihoods = HashMap.fromList [], n = 0}}),
        ("morning",
         Classifier{okData =
@@ -849,6 +867,13 @@
         Classifier{okData =
                      ClassData{prior = 0.0, unseen = -1.3862943611198906,
                                likelihoods = HashMap.fromList [("", 0.0)], n = 2},
+                   koData =
+                     ClassData{prior = -infinity, unseen = -0.6931471805599453,
+                               likelihoods = HashMap.fromList [], n = 0}}),
+       ("<number>\20010/\20491",
+        Classifier{okData =
+                     ClassData{prior = 0.0, unseen = -3.4339872044851463,
+                               likelihoods = HashMap.fromList [("integer (0..10)", 0.0)], n = 29},
                    koData =
                      ClassData{prior = -infinity, unseen = -0.6931471805599453,
                                likelihoods = HashMap.fromList [], n = 0}}),
diff --git a/Duckling/Regex/Types.hs b/Duckling/Regex/Types.hs
--- a/Duckling/Regex/Types.hs
+++ b/Duckling/Regex/Types.hs
@@ -27,4 +27,4 @@
 
 instance Resolve GroupMatch where
   type ResolvedValue GroupMatch = ()
-  resolve _ _ = Nothing
+  resolve _ _ _ = Nothing
diff --git a/Duckling/Resolve.hs b/Duckling/Resolve.hs
--- a/Duckling/Resolve.hs
+++ b/Duckling/Resolve.hs
@@ -12,12 +12,13 @@
 module Duckling.Resolve
   ( Context(..)
   , DucklingTime(..)
+  , Options(..)
   , Resolve(..)
   , fromUTC
   , toUTC
   ) where
 
-import Data.Aeson
+import Data.Aeson (ToJSON)
 import Prelude
 import qualified Data.Time as Time
 import qualified Data.Time.LocalTime.TimeZone.Series as Series
@@ -36,9 +37,14 @@
   }
   deriving (Eq, Show)
 
+newtype Options = Options
+  { withLatent :: Bool  -- When set, includes less certain parses, e.g. "7" as an hour of the day
+  }
+  deriving (Eq, Show)
+
 class ToJSON (ResolvedValue a) => Resolve a where
   type ResolvedValue a
-  resolve :: Context -> a -> Maybe (ResolvedValue a)
+  resolve :: Context -> Options -> a -> Maybe (ResolvedValue a, Bool)
 
 -- | Given a UTCTime and an TimeZone, build a ZonedTime (no conversion)
 fromUTC :: Time.UTCTime -> Time.TimeZone -> Time.ZonedTime
diff --git a/Duckling/Rules.hs b/Duckling/Rules.hs
--- a/Duckling/Rules.hs
+++ b/Duckling/Rules.hs
@@ -52,6 +52,7 @@
 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.TA as TARules
 import qualified Duckling.Rules.TR as TRRules
 import qualified Duckling.Rules.UK as UKRules
 import qualified Duckling.Rules.VI as VIRules
@@ -107,6 +108,7 @@
 defaultRules RO = RORules.defaultRules
 defaultRules RU = RURules.defaultRules
 defaultRules SV = SVRules.defaultRules
+defaultRules TA = TARules.defaultRules
 defaultRules TR = TRRules.defaultRules
 defaultRules UK = UKRules.defaultRules
 defaultRules VI = VIRules.defaultRules
@@ -142,6 +144,7 @@
 localeRules RO = RORules.localeRules
 localeRules RU = RURules.localeRules
 localeRules SV = SVRules.localeRules
+localeRules TA = TARules.localeRules
 localeRules TR = TRRules.localeRules
 localeRules UK = UKRules.localeRules
 localeRules VI = VIRules.localeRules
@@ -177,6 +180,7 @@
 langRules RO = RORules.langRules
 langRules RU = RURules.langRules
 langRules SV = SVRules.langRules
+langRules TA = TARules.langRules
 langRules TR = TRRules.langRules
 langRules UK = UKRules.langRules
 langRules VI = VIRules.langRules
diff --git a/Duckling/Rules/AR.hs b/Duckling/Rules/AR.hs
--- a/Duckling/Rules/AR.hs
+++ b/Duckling/Rules/AR.hs
@@ -32,6 +32,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -49,3 +50,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules AR dim
diff --git a/Duckling/Rules/BG.hs b/Duckling/Rules/BG.hs
--- a/Duckling/Rules/BG.hs
+++ b/Duckling/Rules/BG.hs
@@ -20,25 +20,31 @@
 import Duckling.Types
 import qualified Duckling.Numeral.BG.Rules as Numeral
 import qualified Duckling.AmountOfMoney.BG.Rules as AmountOfMoney
+import qualified Duckling.Distance.BG.Rules as Distance
+import qualified Duckling.Duration.BG.Rules as Duration
+import qualified Duckling.TimeGrain.BG.Rules as TimeGrain
+import qualified Duckling.Ordinal.BG.Rules as Ordinal
 
 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) = AmountOfMoney.rules
-langRules (This Distance) = []
-langRules (This Duration) = []
+langRules (This Distance) = Distance.rules
+langRules (This Duration) = Duration.rules
 langRules (This Email) = []
 langRules (This Numeral) = Numeral.rules
-langRules (This Ordinal) = []
+langRules (This Ordinal) = Ordinal.rules
 langRules (This PhoneNumber) = []
 langRules (This Quantity) = []
 langRules (This RegexMatch) = []
 langRules (This Temperature) = []
 langRules (This Time) = []
-langRules (This TimeGrain) = []
+langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules BG dim
diff --git a/Duckling/Rules/CS.hs b/Duckling/Rules/CS.hs
--- a/Duckling/Rules/CS.hs
+++ b/Duckling/Rules/CS.hs
@@ -25,6 +25,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -42,3 +43,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules CS dim
diff --git a/Duckling/Rules/Common.hs b/Duckling/Rules/Common.hs
--- a/Duckling/Rules/Common.hs
+++ b/Duckling/Rules/Common.hs
@@ -40,3 +40,4 @@
 rules (This TimeGrain) = []
 rules (This Url) = Url.rules
 rules (This Volume) = Volume.rules
+rules (This (CustomDimension dim)) = dimRules dim
diff --git a/Duckling/Rules/DA.hs b/Duckling/Rules/DA.hs
--- a/Duckling/Rules/DA.hs
+++ b/Duckling/Rules/DA.hs
@@ -28,6 +28,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -45,3 +46,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules DA dim
diff --git a/Duckling/Rules/DE.hs b/Duckling/Rules/DE.hs
--- a/Duckling/Rules/DE.hs
+++ b/Duckling/Rules/DE.hs
@@ -28,6 +28,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -45,3 +46,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules DE dim
diff --git a/Duckling/Rules/EL.hs b/Duckling/Rules/EL.hs
--- a/Duckling/Rules/EL.hs
+++ b/Duckling/Rules/EL.hs
@@ -28,6 +28,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -45,3 +46,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules EL dim
diff --git a/Duckling/Rules/EN.hs b/Duckling/Rules/EN.hs
--- a/Duckling/Rules/EN.hs
+++ b/Duckling/Rules/EN.hs
@@ -45,13 +45,8 @@
 import qualified Duckling.Volume.EN.Rules as Volume
 
 defaultRules :: Some Dimension -> [Rule]
-defaultRules dim@(This Time) =
-  [ TimeUS.ruleMMDD
-  , TimeUS.ruleMMDDYYYY
-  , TimeUS.ruleMMDDYYYYDot
-  , TimeUS.ruleThanksgiving
-  ] ++ langRules dim
-defaultRules dim = langRules dim
+defaultRules dim@(This Time) = TimeUS.rulesBackwardCompatible ++ langRules dim
+defaultRules dim             = langRules dim
 
 localeRules :: Region -> Some Dimension -> [Rule]
 localeRules AU (This Time) = TimeAU.rules
@@ -66,7 +61,8 @@
 localeRules TT (This Time) = TimeTT.rules
 localeRules US (This Time) = TimeUS.rules
 localeRules ZA (This Time) = TimeZA.rules
-localeRules _ _            = []
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
 langRules (This AmountOfMoney) = AmountOfMoney.rules
@@ -83,3 +79,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules EN dim
diff --git a/Duckling/Rules/ES.hs b/Duckling/Rules/ES.hs
--- a/Duckling/Rules/ES.hs
+++ b/Duckling/Rules/ES.hs
@@ -31,6 +31,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -48,3 +49,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules ES dim
diff --git a/Duckling/Rules/ET.hs b/Duckling/Rules/ET.hs
--- a/Duckling/Rules/ET.hs
+++ b/Duckling/Rules/ET.hs
@@ -25,6 +25,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -42,3 +43,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules ET dim
diff --git a/Duckling/Rules/FR.hs b/Duckling/Rules/FR.hs
--- a/Duckling/Rules/FR.hs
+++ b/Duckling/Rules/FR.hs
@@ -34,6 +34,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -51,3 +52,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules FR dim
diff --git a/Duckling/Rules/GA.hs b/Duckling/Rules/GA.hs
--- a/Duckling/Rules/GA.hs
+++ b/Duckling/Rules/GA.hs
@@ -32,6 +32,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -49,3 +50,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules GA dim
diff --git a/Duckling/Rules/HE.hs b/Duckling/Rules/HE.hs
--- a/Duckling/Rules/HE.hs
+++ b/Duckling/Rules/HE.hs
@@ -28,6 +28,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -45,3 +46,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules HE dim
diff --git a/Duckling/Rules/HI.hs b/Duckling/Rules/HI.hs
--- a/Duckling/Rules/HI.hs
+++ b/Duckling/Rules/HI.hs
@@ -24,6 +24,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -41,3 +42,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules HI dim
diff --git a/Duckling/Rules/HR.hs b/Duckling/Rules/HR.hs
--- a/Duckling/Rules/HR.hs
+++ b/Duckling/Rules/HR.hs
@@ -34,6 +34,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -51,3 +52,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules HR dim
diff --git a/Duckling/Rules/HU.hs b/Duckling/Rules/HU.hs
--- a/Duckling/Rules/HU.hs
+++ b/Duckling/Rules/HU.hs
@@ -28,6 +28,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -45,3 +46,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules HU dim
diff --git a/Duckling/Rules/ID.hs b/Duckling/Rules/ID.hs
--- a/Duckling/Rules/ID.hs
+++ b/Duckling/Rules/ID.hs
@@ -26,6 +26,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -43,3 +44,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules ID dim
diff --git a/Duckling/Rules/IT.hs b/Duckling/Rules/IT.hs
--- a/Duckling/Rules/IT.hs
+++ b/Duckling/Rules/IT.hs
@@ -31,6 +31,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -48,3 +49,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules IT dim
diff --git a/Duckling/Rules/JA.hs b/Duckling/Rules/JA.hs
--- a/Duckling/Rules/JA.hs
+++ b/Duckling/Rules/JA.hs
@@ -27,6 +27,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -44,3 +45,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules JA dim
diff --git a/Duckling/Rules/KA.hs b/Duckling/Rules/KA.hs
--- a/Duckling/Rules/KA.hs
+++ b/Duckling/Rules/KA.hs
@@ -24,6 +24,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -41,3 +42,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules KA dim
diff --git a/Duckling/Rules/KO.hs b/Duckling/Rules/KO.hs
--- a/Duckling/Rules/KO.hs
+++ b/Duckling/Rules/KO.hs
@@ -33,6 +33,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -50,3 +51,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules KO dim
diff --git a/Duckling/Rules/MY.hs b/Duckling/Rules/MY.hs
--- a/Duckling/Rules/MY.hs
+++ b/Duckling/Rules/MY.hs
@@ -24,6 +24,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -41,3 +42,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules MY dim
diff --git a/Duckling/Rules/NB.hs b/Duckling/Rules/NB.hs
--- a/Duckling/Rules/NB.hs
+++ b/Duckling/Rules/NB.hs
@@ -29,6 +29,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -46,3 +47,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules NB dim
diff --git a/Duckling/Rules/NE.hs b/Duckling/Rules/NE.hs
--- a/Duckling/Rules/NE.hs
+++ b/Duckling/Rules/NE.hs
@@ -23,6 +23,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -40,3 +41,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules NE dim
diff --git a/Duckling/Rules/NL.hs b/Duckling/Rules/NL.hs
--- a/Duckling/Rules/NL.hs
+++ b/Duckling/Rules/NL.hs
@@ -18,6 +18,7 @@
 import Duckling.Dimensions.Types
 import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.AmountOfMoney.NL.Rules as AmountOfMoney
 import qualified Duckling.Distance.NL.Rules as Distance
 import qualified Duckling.Duration.NL.Rules as Duration
 import qualified Duckling.Numeral.NL.Rules as Numeral
@@ -30,10 +31,11 @@
 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 AmountOfMoney) = AmountOfMoney.rules
 langRules (This Distance) = Distance.rules
 langRules (This Duration) = Duration.rules
 langRules (This Email) = []
@@ -47,3 +49,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules NL dim
diff --git a/Duckling/Rules/PL.hs b/Duckling/Rules/PL.hs
--- a/Duckling/Rules/PL.hs
+++ b/Duckling/Rules/PL.hs
@@ -28,6 +28,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -45,3 +46,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules PL dim
diff --git a/Duckling/Rules/PT.hs b/Duckling/Rules/PT.hs
--- a/Duckling/Rules/PT.hs
+++ b/Duckling/Rules/PT.hs
@@ -33,6 +33,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -50,3 +51,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules PT dim
diff --git a/Duckling/Rules/RO.hs b/Duckling/Rules/RO.hs
--- a/Duckling/Rules/RO.hs
+++ b/Duckling/Rules/RO.hs
@@ -33,6 +33,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -50,3 +51,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules RO dim
diff --git a/Duckling/Rules/RU.hs b/Duckling/Rules/RU.hs
--- a/Duckling/Rules/RU.hs
+++ b/Duckling/Rules/RU.hs
@@ -31,6 +31,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -48,3 +49,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules RU dim
diff --git a/Duckling/Rules/SV.hs b/Duckling/Rules/SV.hs
--- a/Duckling/Rules/SV.hs
+++ b/Duckling/Rules/SV.hs
@@ -20,6 +20,7 @@
 import Duckling.Types
 import qualified Duckling.AmountOfMoney.SV.Rules as AmountOfMoney
 import qualified Duckling.Duration.SV.Rules as Duration
+import qualified Duckling.Distance.SV.Rules as Distance
 import qualified Duckling.Ordinal.SV.Rules as Ordinal
 import qualified Duckling.Numeral.SV.Rules as Numeral
 import qualified Duckling.Time.SV.Rules as Time
@@ -29,11 +30,12 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
 langRules (This AmountOfMoney) = AmountOfMoney.rules
-langRules (This Distance) = []
+langRules (This Distance) = Distance.rules
 langRules (This Duration) = Duration.rules
 langRules (This Email) = []
 langRules (This Numeral) = Numeral.rules
@@ -46,3 +48,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules SV dim
diff --git a/Duckling/Rules/TA.hs b/Duckling/Rules/TA.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Rules/TA.hs
@@ -0,0 +1,44 @@
+--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.TA
+  ( defaultRules
+  , langRules
+  , localeRules
+  ) where
+
+import Duckling.Dimensions.Types
+import Duckling.Locale
+import Duckling.Types
+import qualified Duckling.Numeral.TA.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 Distance) = []
+langRules (This Duration) = []
+langRules (This Numeral) = Numeral.rules
+langRules (This Email) = []
+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 TA dim
diff --git a/Duckling/Rules/TR.hs b/Duckling/Rules/TR.hs
--- a/Duckling/Rules/TR.hs
+++ b/Duckling/Rules/TR.hs
@@ -30,6 +30,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -47,3 +48,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = Volume.rules
+langRules (This (CustomDimension dim)) = dimLangRules TR dim
diff --git a/Duckling/Rules/UK.hs b/Duckling/Rules/UK.hs
--- a/Duckling/Rules/UK.hs
+++ b/Duckling/Rules/UK.hs
@@ -25,6 +25,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -42,3 +43,4 @@
 langRules (This TimeGrain) = []
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules UK dim
diff --git a/Duckling/Rules/VI.hs b/Duckling/Rules/VI.hs
--- a/Duckling/Rules/VI.hs
+++ b/Duckling/Rules/VI.hs
@@ -28,6 +28,7 @@
 defaultRules = langRules
 
 localeRules :: Region -> Some Dimension -> [Rule]
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
 localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
@@ -45,3 +46,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules VI dim
diff --git a/Duckling/Rules/ZH.hs b/Duckling/Rules/ZH.hs
--- a/Duckling/Rules/ZH.hs
+++ b/Duckling/Rules/ZH.hs
@@ -18,6 +18,8 @@
 import Duckling.Dimensions.Types
 import Duckling.Locale
 import Duckling.Types
+import qualified Duckling.AmountOfMoney.ZH.Rules as AmountOfMoney
+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
@@ -36,11 +38,12 @@
 localeRules HK (This Time) = TimeHK.rules
 localeRules MO (This Time) = TimeMO.rules
 localeRules TW (This Time) = TimeTW.rules
-localeRules _ _            = []
+localeRules region (This (CustomDimension dim)) = dimLocaleRules region dim
+localeRules _ _ = []
 
 langRules :: Some Dimension -> [Rule]
-langRules (This AmountOfMoney) = []
-langRules (This Distance) = []
+langRules (This AmountOfMoney) = AmountOfMoney.rules
+langRules (This Distance) = Distance.rules
 langRules (This Duration) = []
 langRules (This Email) = []
 langRules (This Numeral) = Numeral.rules
@@ -53,3 +56,4 @@
 langRules (This TimeGrain) = TimeGrain.rules
 langRules (This Url) = []
 langRules (This Volume) = []
+langRules (This (CustomDimension dim)) = dimLangRules ZH dim
diff --git a/Duckling/Temperature/AR/Corpus.hs b/Duckling/Temperature/AR/Corpus.hs
--- a/Duckling/Temperature/AR/Corpus.hs
+++ b/Duckling/Temperature/AR/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/EN/Corpus.hs b/Duckling/Temperature/EN/Corpus.hs
--- a/Duckling/Temperature/EN/Corpus.hs
+++ b/Duckling/Temperature/EN/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/ES/Corpus.hs b/Duckling/Temperature/ES/Corpus.hs
--- a/Duckling/Temperature/ES/Corpus.hs
+++ b/Duckling/Temperature/ES/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/FR/Corpus.hs b/Duckling/Temperature/FR/Corpus.hs
--- a/Duckling/Temperature/FR/Corpus.hs
+++ b/Duckling/Temperature/FR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/GA/Corpus.hs b/Duckling/Temperature/GA/Corpus.hs
--- a/Duckling/Temperature/GA/Corpus.hs
+++ b/Duckling/Temperature/GA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/HR/Corpus.hs b/Duckling/Temperature/HR/Corpus.hs
--- a/Duckling/Temperature/HR/Corpus.hs
+++ b/Duckling/Temperature/HR/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/Helpers.hs b/Duckling/Temperature/Helpers.hs
--- a/Duckling/Temperature/Helpers.hs
+++ b/Duckling/Temperature/Helpers.hs
@@ -20,7 +20,7 @@
 import Duckling.Dimensions.Types
 import qualified Duckling.Temperature.Types as TTemperature
 import Duckling.Temperature.Types (TemperatureData(..))
-import Duckling.Types
+import Duckling.Types hiding (isLatent)
 
 -- -----------------------------------------------------------------
 -- Patterns
diff --git a/Duckling/Temperature/IT/Corpus.hs b/Duckling/Temperature/IT/Corpus.hs
--- a/Duckling/Temperature/IT/Corpus.hs
+++ b/Duckling/Temperature/IT/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/JA/Corpus.hs b/Duckling/Temperature/JA/Corpus.hs
--- a/Duckling/Temperature/JA/Corpus.hs
+++ b/Duckling/Temperature/JA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale JA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale JA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/KO/Corpus.hs b/Duckling/Temperature/KO/Corpus.hs
--- a/Duckling/Temperature/KO/Corpus.hs
+++ b/Duckling/Temperature/KO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/KO/Rules.hs b/Duckling/Temperature/KO/Rules.hs
--- a/Duckling/Temperature/KO/Rules.hs
+++ b/Duckling/Temperature/KO/Rules.hs
@@ -18,7 +18,7 @@
 import Duckling.Dimensions.Types
 import Duckling.Temperature.Helpers
 import qualified Duckling.Temperature.Types as TTemperature
-import Duckling.Types
+import Duckling.Types hiding (isLatent)
 
 ruleLatentTempDegrees :: Rule
 ruleLatentTempDegrees = Rule
diff --git a/Duckling/Temperature/PT/Corpus.hs b/Duckling/Temperature/PT/Corpus.hs
--- a/Duckling/Temperature/PT/Corpus.hs
+++ b/Duckling/Temperature/PT/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/RO/Corpus.hs b/Duckling/Temperature/RO/Corpus.hs
--- a/Duckling/Temperature/RO/Corpus.hs
+++ b/Duckling/Temperature/RO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/TR/Corpus.hs b/Duckling/Temperature/TR/Corpus.hs
--- a/Duckling/Temperature/TR/Corpus.hs
+++ b/Duckling/Temperature/TR/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Temperature/Types.hs b/Duckling/Temperature/Types.hs
--- a/Duckling/Temperature/Types.hs
+++ b/Duckling/Temperature/Types.hs
@@ -39,9 +39,9 @@
 
 instance Resolve TemperatureData where
   type ResolvedValue TemperatureData = TemperatureValue
-  resolve _ TemperatureData {unit = Nothing} = Nothing
-  resolve _ TemperatureData {unit = Just unit, value} =
-    Just TemperatureValue {vUnit = unit, vValue = value}
+  resolve _ _ TemperatureData {unit = Nothing} = Nothing
+  resolve _ _ TemperatureData {unit = Just unit, value} =
+    Just (TemperatureValue {vUnit = unit, vValue = value}, False)
 
 data TemperatureValue = TemperatureValue
   { vUnit :: TemperatureUnit
diff --git a/Duckling/Temperature/ZH/Corpus.hs b/Duckling/Temperature/ZH/Corpus.hs
--- a/Duckling/Temperature/ZH/Corpus.hs
+++ b/Duckling/Temperature/ZH/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Testing/Types.hs b/Duckling/Testing/Types.hs
--- a/Duckling/Testing/Types.hs
+++ b/Duckling/Testing/Types.hs
@@ -20,12 +20,14 @@
   , examplesCustom
   , parserCheck
   , refTime
+  , simpleCheck
   , testContext
+  , testOptions
   , withLocale
   , zTime
   ) where
 
-import Data.Aeson
+import Data.Aeson (toJSON, ToJSON, Value)
 import Data.Fixed (Pico)
 import Data.Text (Text)
 import Prelude
@@ -37,8 +39,8 @@
 
 type TestPredicate = Context -> ResolvedToken -> Bool
 type Example = (Text, TestPredicate)
-type Corpus = (Context, [Example])
-type NegativeCorpus = (Context, [Text])
+type Corpus = (Context, Options, [Example])
+type NegativeCorpus = (Context, Options, [Text])
 
 examplesCustom :: TestPredicate -> [Text] -> [Example]
 examplesCustom check = map (, check)
@@ -74,6 +76,12 @@
   , referenceTime = refTime (2013, 2, 12, 4, 30, 0) (-2)
   }
 
-withLocale :: (Context, [a]) -> Locale -> [a] -> (Context, [a])
-withLocale (langContext, langXs) locale localeXs
-  = (langContext {locale = locale}, langXs ++ localeXs)
+testOptions :: Options
+testOptions = Options
+  { withLatent = False
+  }
+
+withLocale :: (Context, Options, [a]) -> Locale -> [a]
+  -> (Context, Options, [a])
+withLocale (langContext, options, langXs) locale localeXs
+  = (langContext {locale = locale}, options, langXs ++ localeXs)
diff --git a/Duckling/Time/AR/Corpus.hs b/Duckling/Time/AR/Corpus.hs
--- a/Duckling/Time/AR/Corpus.hs
+++ b/Duckling/Time/AR/Corpus.hs
@@ -27,10 +27,10 @@
 context = testContext {locale = makeLocale AR Nothing}
 
 corpus :: Corpus
-corpus = (context, allExamples)
+corpus = (context, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (context, examples)
+negativeCorpus = (context, testOptions, examples)
   where
     examples =
       [ "حب"
diff --git a/Duckling/Time/AR/Rules.hs b/Duckling/Time/AR/Rules.hs
--- a/Duckling/Time/AR/Rules.hs
+++ b/Duckling/Time/AR/Rules.hs
@@ -17,7 +17,7 @@
 import Data.Maybe
 import Data.Text (Text)
 import Prelude
-import Data.HashMap.Strict ( HashMap)
+import Data.HashMap.Strict (HashMap)
 import qualified Data.HashMap.Strict as HashMap
 import qualified Data.Text as Text
 
@@ -25,7 +25,6 @@
 import Duckling.Duration.Helpers (duration)
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Numeral.Types (NumeralData (..))
-import Duckling.Ordinal.Types (OrdinalData (..))
 import Duckling.Regex.Types
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
diff --git a/Duckling/Time/Computed.hs b/Duckling/Time/Computed.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/Time/Computed.hs
@@ -0,0 +1,1571 @@
+-- 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.Time.Computed
+  ( chanukah, chineseNewYear, dhanteras, easterSunday, eidalAdha, eidalFitr
+  , lagBaOmer, mawlid, muharram, navaratri, orthodoxEaster, passover, rajab
+  , rakshaBandhan, ramadan, roshHashana, thaiPongal, thiruOnam, tishaBAv
+  , tuBishvat, vasantPanchami, yomHaatzmaut
+  ) where
+
+import Data.Maybe
+import Prelude
+import qualified Data.Time as Time
+
+import Duckling.Time.Helpers (timeComputed)
+import Duckling.Time.Types (TimeData(..), TimeObject(..), timedata')
+import qualified Duckling.TimeGrain.Types as TG
+
+toTimeObjectM :: (Integer, Int, Int) -> Maybe TimeObject
+toTimeObjectM (year, month, day) = do
+  day <- Time.fromGregorianValid year month day
+  return TimeObject
+    { start = Time.UTCTime day 0
+    , grain = TG.Day
+    , end = Nothing
+    }
+
+computedDays :: [TimeObject] -> TimeData
+computedDays xs = timedata'
+  { timePred = timeComputed xs
+  , timeGrain = TG.Day
+  }
+
+chanukah :: TimeData
+chanukah = computedDays chanukah'
+
+chanukah' :: [TimeObject]
+chanukah' = mapMaybe toTimeObjectM
+  [ (1950, 12, 3)
+  , (1951, 12, 23)
+  , (1952, 12, 12)
+  , (1953, 12, 1)
+  , (1954, 12, 19)
+  , (1955, 12, 9)
+  , (1956, 11, 28)
+  , (1957, 12, 17)
+  , (1958, 12, 6)
+  , (1959, 12, 25)
+  , (1960, 12, 13)
+  , (1961, 12, 2)
+  , (1962, 12, 21)
+  , (1963, 12, 10)
+  , (1964, 11, 29)
+  , (1965, 12, 18)
+  , (1966, 12, 7)
+  , (1967, 12, 26)
+  , (1968, 12, 15)
+  , (1969, 12, 4)
+  , (1970, 12, 22)
+  , (1971, 12, 12)
+  , (1972, 11, 30)
+  , (1973, 12, 19)
+  , (1974, 12, 8)
+  , (1975, 11, 28)
+  , (1976, 12, 16)
+  , (1977, 12, 4)
+  , (1978, 12, 24)
+  , (1979, 12, 14)
+  , (1980, 12, 2)
+  , (1981, 12, 20)
+  , (1982, 12, 10)
+  , (1983, 11, 30)
+  , (1984, 12, 18)
+  , (1985, 12, 7)
+  , (1986, 12, 26)
+  , (1987, 12, 15)
+  , (1988, 12, 3)
+  , (1989, 12, 22)
+  , (1990, 12, 11)
+  , (1991, 12, 1)
+  , (1992, 12, 19)
+  , (1993, 12, 8)
+  , (1994, 11, 27)
+  , (1995, 12, 17)
+  , (1996, 12, 5)
+  , (1997, 12, 23)
+  , (1998, 12, 13)
+  , (1999, 12, 3)
+  , (2000, 12, 21)
+  , (2001, 12, 9)
+  , (2002, 11, 29)
+  , (2003, 12, 19)
+  , (2004, 12, 7)
+  , (2005, 12, 25)
+  , (2006, 12, 15)
+  , (2007, 12, 4)
+  , (2008, 12, 21)
+  , (2009, 12, 11)
+  , (2010, 12, 1)
+  , (2011, 12, 20)
+  , (2012, 12, 8)
+  , (2013, 11, 27)
+  , (2014, 12, 16)
+  , (2015, 12, 6)
+  , (2016, 12, 24)
+  , (2017, 12, 12)
+  , (2018, 12, 2)
+  , (2019, 12, 22)
+  , (2020, 12, 10)
+  , (2021, 11, 28)
+  , (2022, 12, 18)
+  , (2023, 12, 7)
+  , (2024, 12, 25)
+  , (2025, 12, 14)
+  , (2026, 12, 4)
+  , (2027, 12, 24)
+  , (2028, 12, 12)
+  , (2029, 12, 1)
+  , (2030, 12, 20)
+  , (2031, 12, 9)
+  , (2032, 11, 27)
+  , (2033, 12, 16)
+  , (2034, 12, 6)
+  , (2035, 12, 25)
+  , (2036, 12, 13)
+  , (2037, 12, 2)
+  , (2038, 12, 21)
+  , (2039, 12, 11)
+  , (2040, 11, 29)
+  , (2041, 12, 17)
+  , (2042, 12, 7)
+  , (2043, 12, 26)
+  , (2044, 12, 14)
+  , (2045, 12, 3)
+  , (2046, 12, 23)
+  , (2047, 12, 12)
+  , (2048, 11, 29)
+  , (2049, 12, 19)
+  , (2050, 12, 9)
+  ]
+
+chineseNewYear :: TimeData
+chineseNewYear = computedDays chineseNewYear'
+
+chineseNewYear' :: [TimeObject]
+chineseNewYear' = mapMaybe toTimeObjectM
+  [ (1950, 2, 17)
+  , (1951, 2, 6)
+  , (1952, 1, 27)
+  , (1953, 2, 14)
+  , (1954, 2, 3)
+  , (1955, 1, 24)
+  , (1956, 2, 12)
+  , (1957, 1, 31)
+  , (1958, 2, 18)
+  , (1959, 2, 8)
+  , (1960, 1, 28)
+  , (1961, 2, 15)
+  , (1962, 2, 5)
+  , (1963, 1, 25)
+  , (1964, 2, 13)
+  , (1965, 2, 2)
+  , (1966, 1, 21)
+  , (1967, 2, 9)
+  , (1968, 1, 30)
+  , (1969, 2, 17)
+  , (1970, 2, 6)
+  , (1971, 1, 27)
+  , (1972, 2, 15)
+  , (1973, 2, 3)
+  , (1974, 1, 23)
+  , (1975, 2, 11)
+  , (1976, 1, 31)
+  , (1977, 2, 18)
+  , (1978, 2, 7)
+  , (1979, 1, 28)
+  , (1980, 2, 16)
+  , (1981, 2, 5)
+  , (1982, 1, 25)
+  , (1983, 2, 13)
+  , (1984, 2, 2)
+  , (1985, 2, 20)
+  , (1986, 2, 9)
+  , (1987, 1, 29)
+  , (1988, 2, 17)
+  , (1989, 2, 6)
+  , (1990, 1, 27)
+  , (1991, 2, 15)
+  , (1992, 2, 4)
+  , (1993, 1, 23)
+  , (1994, 2, 10)
+  , (1995, 1, 31)
+  , (1996, 2, 19)
+  , (1997, 2, 7)
+  , (1998, 1, 28)
+  , (1999, 2, 16)
+  , (2000, 2, 5)
+  , (2001, 1, 24)
+  , (2002, 2, 12)
+  , (2003, 2, 1)
+  , (2004, 1, 22)
+  , (2005, 2, 9)
+  , (2006, 1, 29)
+  , (2007, 2, 18)
+  , (2008, 2, 7)
+  , (2009, 1, 26)
+  , (2010, 2, 14)
+  , (2011, 2, 3)
+  , (2012, 1, 23)
+  , (2013, 2, 10)
+  , (2014, 1, 31)
+  , (2015, 2, 19)
+  , (2016, 2, 8)
+  , (2017, 1, 28)
+  , (2018, 2, 16)
+  , (2019, 2, 5)
+  , (2020, 1, 25)
+  , (2021, 2, 12)
+  , (2022, 2, 1)
+  , (2023, 1, 22)
+  , (2024, 2, 10)
+  , (2025, 1, 29)
+  , (2026, 2, 17)
+  , (2027, 2, 6)
+  , (2028, 1, 26)
+  , (2029, 2, 13)
+  , (2030, 2, 3)
+  , (2031, 1, 23)
+  , (2032, 2, 11)
+  , (2033, 1, 31)
+  , (2034, 2, 19)
+  , (2035, 2, 8)
+  , (2036, 1, 28)
+  , (2037, 2, 15)
+  , (2038, 2, 4)
+  , (2039, 1, 24)
+  , (2040, 2, 12)
+  , (2041, 2, 1)
+  , (2042, 1, 22)
+  , (2043, 2, 10)
+  , (2044, 1, 30)
+  , (2045, 2, 17)
+  , (2046, 2, 6)
+  , (2047, 1, 26)
+  , (2048, 2, 14)
+  , (2049, 2, 2)
+  , (2050, 1, 23)
+  ]
+
+easterSunday :: TimeData
+easterSunday = computedDays easterSunday'
+
+easterSunday' :: [TimeObject]
+easterSunday' = mapMaybe toTimeObjectM
+  [ (1950, 4, 9)
+  , (1951, 3, 25)
+  , (1952, 4, 13)
+  , (1953, 4, 5)
+  , (1954, 4, 18)
+  , (1955, 4, 10)
+  , (1956, 4, 1)
+  , (1957, 4, 21)
+  , (1958, 4, 6)
+  , (1959, 3, 29)
+  , (1960, 4, 17)
+  , (1961, 4, 2)
+  , (1962, 4, 22)
+  , (1963, 4, 14)
+  , (1964, 3, 29)
+  , (1965, 4, 18)
+  , (1966, 4, 10)
+  , (1967, 3, 26)
+  , (1968, 4, 14)
+  , (1969, 4, 6)
+  , (1970, 3, 29)
+  , (1971, 4, 11)
+  , (1972, 4, 2)
+  , (1973, 4, 22)
+  , (1974, 4, 14)
+  , (1975, 3, 30)
+  , (1976, 4, 18)
+  , (1977, 4, 10)
+  , (1978, 3, 26)
+  , (1979, 4, 15)
+  , (1980, 4, 6)
+  , (1981, 4, 19)
+  , (1982, 4, 11)
+  , (1983, 4, 3)
+  , (1984, 4, 22)
+  , (1985, 4, 7)
+  , (1986, 3, 30)
+  , (1987, 4, 19)
+  , (1988, 4, 3)
+  , (1989, 3, 26)
+  , (1990, 4, 15)
+  , (1991, 3, 31)
+  , (1992, 4, 19)
+  , (1993, 4, 11)
+  , (1994, 4, 3)
+  , (1995, 4, 16)
+  , (1996, 4, 7)
+  , (1997, 3, 30)
+  , (1998, 4, 12)
+  , (1999, 4, 4)
+  , (2000, 4, 23)
+  , (2001, 4, 15)
+  , (2002, 3, 31)
+  , (2003, 4, 20)
+  , (2004, 4, 11)
+  , (2005, 3, 27)
+  , (2006, 4, 16)
+  , (2007, 4, 8)
+  , (2008, 3, 23)
+  , (2009, 4, 12)
+  , (2010, 4, 4)
+  , (2011, 4, 24)
+  , (2012, 4, 8)
+  , (2013, 3, 31)
+  , (2014, 4, 20)
+  , (2015, 4, 5)
+  , (2016, 3, 27)
+  , (2017, 4, 16)
+  , (2018, 4, 1)
+  , (2019, 4, 21)
+  , (2020, 4, 12)
+  , (2021, 4, 4)
+  , (2022, 4, 17)
+  , (2023, 4, 9)
+  , (2024, 3, 31)
+  , (2025, 4, 20)
+  , (2026, 4, 5)
+  , (2027, 3, 28)
+  , (2028, 4, 16)
+  , (2029, 4, 1)
+  , (2030, 4, 21)
+  , (2031, 4, 13)
+  , (2032, 3, 28)
+  , (2033, 4, 17)
+  , (2034, 4, 9)
+  , (2035, 3, 25)
+  , (2036, 4, 13)
+  , (2037, 4, 5)
+  , (2038, 4, 25)
+  , (2039, 4, 10)
+  , (2040, 4, 1)
+  , (2041, 4, 21)
+  , (2042, 4, 6)
+  , (2043, 3, 29)
+  , (2044, 4, 17)
+  , (2045, 4, 9)
+  , (2046, 3, 25)
+  , (2047, 4, 14)
+  , (2048, 4, 5)
+  , (2049, 4, 18)
+  , (2050, 4, 10)
+  ]
+
+lagBaOmer :: TimeData
+lagBaOmer = computedDays lagBaOmer'
+
+lagBaOmer' :: [TimeObject]
+lagBaOmer' = mapMaybe toTimeObjectM
+  [ (1950, 5, 4)
+  , (1951, 5, 23)
+  , (1952, 5, 12)
+  , (1953, 5, 2)
+  , (1954, 5, 20)
+  , (1955, 5, 9)
+  , (1956, 4, 28)
+  , (1957, 5, 18)
+  , (1958, 5, 7)
+  , (1959, 5, 25)
+  , (1960, 5, 14)
+  , (1961, 5, 3)
+  , (1962, 5, 21)
+  , (1963, 5, 11)
+  , (1964, 4, 29)
+  , (1965, 5, 19)
+  , (1966, 5, 7)
+  , (1967, 5, 27)
+  , (1968, 5, 15)
+  , (1969, 5, 5)
+  , (1970, 5, 23)
+  , (1971, 5, 12)
+  , (1972, 5, 1)
+  , (1973, 5, 19)
+  , (1974, 5, 9)
+  , (1975, 4, 28)
+  , (1976, 5, 17)
+  , (1977, 5, 5)
+  , (1978, 5, 24)
+  , (1979, 5, 14)
+  , (1980, 5, 3)
+  , (1981, 5, 21)
+  , (1982, 5, 10)
+  , (1983, 4, 30)
+  , (1984, 5, 19)
+  , (1985, 5, 8)
+  , (1986, 5, 26)
+  , (1987, 5, 16)
+  , (1988, 5, 4)
+  , (1989, 5, 22)
+  , (1990, 5, 12)
+  , (1991, 5, 1)
+  , (1992, 5, 20)
+  , (1993, 5, 8)
+  , (1994, 4, 28)
+  , (1995, 5, 17)
+  , (1996, 5, 6)
+  , (1997, 5, 24)
+  , (1998, 5, 13)
+  , (1999, 5, 3)
+  , (2000, 5, 22)
+  , (2001, 5, 10)
+  , (2002, 4, 29)
+  , (2003, 5, 19)
+  , (2004, 5, 8)
+  , (2005, 5, 26)
+  , (2006, 5, 15)
+  , (2007, 5, 5)
+  , (2008, 5, 22)
+  , (2009, 5, 11)
+  , (2010, 5, 1)
+  , (2011, 5, 21)
+  , (2012, 5, 9)
+  , (2013, 4, 27)
+  , (2014, 5, 17)
+  , (2015, 5, 6)
+  , (2016, 5, 25)
+  , (2017, 5, 13)
+  , (2018, 5, 2)
+  , (2019, 5, 22)
+  , (2020, 5, 11)
+  , (2021, 4, 29)
+  , (2022, 5, 18)
+  , (2023, 5, 8)
+  , (2024, 5, 25)
+  , (2025, 5, 15)
+  , (2026, 5, 4)
+  , (2027, 5, 24)
+  , (2028, 5, 13)
+  , (2029, 5, 2)
+  , (2030, 5, 20)
+  , (2031, 5, 10)
+  , (2032, 4, 28)
+  , (2033, 5, 16)
+  , (2034, 5, 6)
+  , (2035, 5, 26)
+  , (2036, 5, 14)
+  , (2037, 5, 2)
+  , (2038, 5, 22)
+  , (2039, 5, 11)
+  , (2040, 4, 30)
+  , (2041, 5, 18)
+  , (2042, 5, 7)
+  , (2043, 5, 27)
+  , (2044, 5, 14)
+  , (2045, 5, 4)
+  , (2046, 5, 23)
+  , (2047, 5, 13)
+  , (2048, 4, 30)
+  , (2049, 5, 19)
+  , (2050, 5, 9)
+  ]
+
+orthodoxEaster :: TimeData
+orthodoxEaster = computedDays orthodoxEaster'
+
+orthodoxEaster' :: [TimeObject]
+orthodoxEaster' = mapMaybe toTimeObjectM
+  [ (1950, 4, 9)
+  , (1951, 4, 29)
+  , (1952, 4, 20)
+  , (1953, 4, 5)
+  , (1954, 4, 25)
+  , (1955, 4, 17)
+  , (1956, 5, 6)
+  , (1957, 4, 21)
+  , (1958, 4, 13)
+  , (1959, 5, 3)
+  , (1960, 4, 17)
+  , (1961, 4, 9)
+  , (1962, 4, 29)
+  , (1963, 4, 14)
+  , (1964, 5, 3)
+  , (1965, 4, 25)
+  , (1966, 4, 10)
+  , (1967, 4, 30)
+  , (1968, 4, 21)
+  , (1969, 4, 13)
+  , (1970, 4, 26)
+  , (1971, 4, 18)
+  , (1972, 4, 9)
+  , (1973, 4, 29)
+  , (1974, 4, 14)
+  , (1975, 5, 4)
+  , (1976, 4, 25)
+  , (1977, 4, 10)
+  , (1978, 4, 30)
+  , (1979, 4, 22)
+  , (1980, 4, 6)
+  , (1981, 4, 26)
+  , (1982, 4, 18)
+  , (1983, 5, 8)
+  , (1984, 4, 22)
+  , (1985, 4, 14)
+  , (1986, 5, 4)
+  , (1987, 4, 19)
+  , (1988, 4, 10)
+  , (1989, 4, 30)
+  , (1990, 4, 15)
+  , (1991, 4, 7)
+  , (1992, 4, 26)
+  , (1993, 4, 18)
+  , (1994, 5, 1)
+  , (1995, 4, 23)
+  , (1996, 4, 14)
+  , (1997, 4, 27)
+  , (1998, 4, 19)
+  , (1999, 4, 11)
+  , (2000, 4, 30)
+  , (2001, 4, 15)
+  , (2002, 5, 5)
+  , (2003, 4, 27)
+  , (2004, 4, 11)
+  , (2005, 5, 1)
+  , (2006, 4, 23)
+  , (2007, 4, 8)
+  , (2008, 4, 27)
+  , (2009, 4, 19)
+  , (2010, 4, 4)
+  , (2011, 4, 24)
+  , (2012, 4, 15)
+  , (2013, 5, 5)
+  , (2014, 4, 20)
+  , (2015, 4, 12)
+  , (2016, 5, 1)
+  , (2017, 4, 16)
+  , (2018, 4, 8)
+  , (2019, 4, 28)
+  , (2020, 4, 19)
+  , (2021, 5, 2)
+  , (2022, 4, 24)
+  , (2023, 4, 16)
+  , (2024, 5, 5)
+  , (2025, 4, 20)
+  , (2026, 4, 12)
+  , (2027, 5, 2)
+  , (2028, 4, 16)
+  , (2029, 4, 8)
+  , (2030, 4, 28)
+  , (2031, 4, 13)
+  , (2032, 5, 2)
+  , (2033, 4, 24)
+  , (2034, 4, 9)
+  , (2035, 4, 29)
+  , (2036, 4, 20)
+  , (2037, 4, 5)
+  , (2038, 4, 25)
+  , (2039, 4, 17)
+  , (2040, 5, 6)
+  , (2041, 4, 21)
+  , (2042, 4, 13)
+  , (2043, 5, 3)
+  , (2044, 4, 24)
+  , (2045, 4, 9)
+  , (2046, 4, 29)
+  , (2047, 4, 21)
+  , (2048, 4, 5)
+  , (2049, 4, 25)
+  , (2050, 4, 17)
+  ]
+
+passover :: TimeData
+passover = computedDays passover'
+
+passover' :: [TimeObject]
+passover' = mapMaybe toTimeObjectM
+  [ (1950, 4, 1)
+  , (1951, 4, 20)
+  , (1952, 4, 9)
+  , (1953, 3, 30)
+  , (1954, 4, 17)
+  , (1955, 4, 6)
+  , (1956, 3, 26)
+  , (1957, 4, 15)
+  , (1958, 4, 4)
+  , (1959, 4, 22)
+  , (1960, 4, 11)
+  , (1961, 3, 31)
+  , (1962, 4, 18)
+  , (1963, 4, 8)
+  , (1964, 3, 27)
+  , (1965, 4, 16)
+  , (1966, 4, 4)
+  , (1967, 4, 24)
+  , (1968, 4, 12)
+  , (1969, 4, 2)
+  , (1970, 4, 20)
+  , (1971, 4, 9)
+  , (1972, 3, 29)
+  , (1973, 4, 16)
+  , (1974, 4, 6)
+  , (1975, 3, 26)
+  , (1976, 4, 14)
+  , (1977, 4, 2)
+  , (1978, 4, 21)
+  , (1979, 4, 11)
+  , (1980, 3, 31)
+  , (1981, 4, 18)
+  , (1982, 4, 7)
+  , (1983, 3, 28)
+  , (1984, 4, 16)
+  , (1985, 4, 5)
+  , (1986, 4, 23)
+  , (1987, 4, 13)
+  , (1988, 4, 1)
+  , (1989, 4, 19)
+  , (1990, 4, 9)
+  , (1991, 3, 29)
+  , (1992, 4, 17)
+  , (1993, 4, 5)
+  , (1994, 3, 26)
+  , (1995, 4, 14)
+  , (1996, 4, 3)
+  , (1997, 4, 21)
+  , (1998, 4, 10)
+  , (1999, 3, 31)
+  , (2000, 4, 19)
+  , (2001, 4, 7)
+  , (2002, 3, 27)
+  , (2003, 4, 16)
+  , (2004, 4, 5)
+  , (2005, 4, 23)
+  , (2006, 4, 12)
+  , (2007, 4, 2)
+  , (2008, 4, 19)
+  , (2009, 4, 8)
+  , (2010, 3, 29)
+  , (2011, 4, 18)
+  , (2012, 4, 6)
+  , (2013, 3, 25)
+  , (2014, 4, 14)
+  , (2015, 4, 3)
+  , (2016, 4, 22)
+  , (2017, 4, 10)
+  , (2018, 3, 30)
+  , (2019, 4, 19)
+  , (2020, 4, 8)
+  , (2021, 3, 27)
+  , (2022, 4, 15)
+  , (2023, 4, 5)
+  , (2024, 4, 22)
+  , (2025, 4, 12)
+  , (2026, 4, 1)
+  , (2027, 4, 21)
+  , (2028, 4, 10)
+  , (2029, 3, 30)
+  , (2030, 4, 17)
+  , (2031, 4, 7)
+  , (2032, 3, 26)
+  , (2033, 4, 13)
+  , (2034, 4, 3)
+  , (2035, 4, 23)
+  , (2036, 4, 11)
+  , (2037, 3, 30)
+  , (2038, 4, 19)
+  , (2039, 4, 8)
+  , (2040, 3, 28)
+  , (2041, 4, 15)
+  , (2042, 4, 4)
+  , (2043, 4, 24)
+  , (2044, 4, 11)
+  , (2045, 4, 1)
+  , (2046, 4, 20)
+  , (2047, 4, 10)
+  , (2048, 3, 28)
+  , (2049, 4, 16)
+  , (2050, 4, 6)
+  ]
+
+roshHashana :: TimeData
+roshHashana = computedDays roshHashana'
+
+roshHashana' :: [TimeObject]
+roshHashana' = mapMaybe toTimeObjectM
+  [ (1950, 9, 11)
+  , (1951, 9, 30)
+  , (1952, 9, 19)
+  , (1953, 9, 9)
+  , (1954, 9, 27)
+  , (1955, 9, 16)
+  , (1956, 9, 5)
+  , (1957, 9, 25)
+  , (1958, 9, 14)
+  , (1959, 10, 2)
+  , (1960, 9, 21)
+  , (1961, 9, 10)
+  , (1962, 9, 28)
+  , (1963, 9, 18)
+  , (1964, 9, 6)
+  , (1965, 9, 26)
+  , (1966, 9, 14)
+  , (1967, 10, 4)
+  , (1968, 9, 22)
+  , (1969, 9, 12)
+  , (1970, 9, 30)
+  , (1971, 9, 19)
+  , (1972, 9, 8)
+  , (1973, 9, 26)
+  , (1974, 9, 16)
+  , (1975, 9, 5)
+  , (1976, 9, 24)
+  , (1977, 9, 12)
+  , (1978, 10, 1)
+  , (1979, 9, 21)
+  , (1980, 9, 10)
+  , (1981, 9, 28)
+  , (1982, 9, 17)
+  , (1983, 9, 7)
+  , (1984, 9, 26)
+  , (1985, 9, 15)
+  , (1986, 10, 3)
+  , (1987, 9, 23)
+  , (1988, 9, 11)
+  , (1989, 9, 29)
+  , (1990, 9, 19)
+  , (1991, 9, 8)
+  , (1992, 9, 27)
+  , (1993, 9, 15)
+  , (1994, 9, 5)
+  , (1995, 9, 24)
+  , (1996, 9, 13)
+  , (1997, 10, 1)
+  , (1998, 9, 20)
+  , (1999, 9, 10)
+  , (2000, 9, 29)
+  , (2001, 9, 17)
+  , (2002, 9, 6)
+  , (2003, 9, 26)
+  , (2004, 9, 15)
+  , (2005, 10, 3)
+  , (2006, 9, 22)
+  , (2007, 9, 12)
+  , (2008, 9, 29)
+  , (2009, 9, 18)
+  , (2010, 9, 8)
+  , (2011, 9, 28)
+  , (2012, 9, 18)
+  , (2013, 9, 4)
+  , (2014, 9, 24)
+  , (2015, 9, 13)
+  , (2016, 10, 2)
+  , (2017, 9, 20)
+  , (2018, 9, 9)
+  , (2019, 9, 29)
+  , (2020, 9, 18)
+  , (2021, 9, 6)
+  , (2022, 9, 25)
+  , (2023, 9, 15)
+  , (2024, 10, 2)
+  , (2025, 9, 22)
+  , (2026, 9, 11)
+  , (2027, 10, 1)
+  , (2028, 9, 20)
+  , (2029, 9, 9)
+  , (2030, 9, 27)
+  , (2031, 9, 17)
+  , (2032, 9, 5)
+  , (2033, 9, 23)
+  , (2034, 9, 13)
+  , (2035, 10, 3)
+  , (2036, 9, 21)
+  , (2037, 9, 9)
+  , (2038, 9, 29)
+  , (2039, 9, 18)
+  , (2040, 9, 7)
+  , (2041, 9, 25)
+  , (2042, 9, 14)
+  , (2043, 10, 4)
+  , (2044, 9, 21)
+  , (2045, 9, 11)
+  , (2046, 9, 30)
+  , (2047, 9, 20)
+  , (2048, 9, 7)
+  , (2049, 9, 26)
+  , (2050, 9, 16)
+  ]
+
+tishaBAv :: TimeData
+tishaBAv = computedDays tishaBAv'
+
+tishaBAv' :: [TimeObject]
+tishaBAv' = mapMaybe toTimeObjectM
+  [ (1950, 7, 22)
+  , (1951, 8, 11)
+  , (1952, 7, 30)
+  , (1953, 7, 20)
+  , (1954, 8, 7)
+  , (1955, 7, 27)
+  , (1956, 7, 16)
+  , (1957, 8, 5)
+  , (1958, 7, 26)
+  , (1959, 8, 12)
+  , (1960, 8, 1)
+  , (1961, 7, 22)
+  , (1962, 8, 8)
+  , (1963, 7, 29)
+  , (1964, 7, 18)
+  , (1965, 8, 7)
+  , (1966, 7, 25)
+  , (1967, 8, 14)
+  , (1968, 8, 3)
+  , (1969, 7, 23)
+  , (1970, 8, 10)
+  , (1971, 7, 31)
+  , (1972, 7, 19)
+  , (1973, 8, 6)
+  , (1974, 7, 27)
+  , (1975, 7, 16)
+  , (1976, 8, 4)
+  , (1977, 7, 23)
+  , (1978, 8, 12)
+  , (1979, 8, 1)
+  , (1980, 7, 21)
+  , (1981, 8, 8)
+  , (1982, 7, 28)
+  , (1983, 7, 18)
+  , (1984, 8, 6)
+  , (1985, 7, 27)
+  , (1986, 8, 13)
+  , (1987, 8, 3)
+  , (1988, 7, 23)
+  , (1989, 8, 9)
+  , (1990, 7, 30)
+  , (1991, 7, 20)
+  , (1992, 8, 8)
+  , (1993, 7, 26)
+  , (1994, 7, 16)
+  , (1995, 8, 5)
+  , (1996, 7, 24)
+  , (1997, 8, 11)
+  , (1998, 8, 1)
+  , (1999, 7, 21)
+  , (2000, 8, 9)
+  , (2001, 7, 28)
+  , (2002, 7, 17)
+  , (2003, 8, 6)
+  , (2004, 7, 26)
+  , (2005, 8, 13)
+  , (2006, 8, 2)
+  , (2007, 7, 23)
+  , (2008, 8, 9)
+  , (2009, 7, 29)
+  , (2010, 7, 19)
+  , (2011, 8, 8)
+  , (2012, 7, 28)
+  , (2013, 7, 15)
+  , (2014, 8, 4)
+  , (2015, 7, 25)
+  , (2016, 8, 13)
+  , (2017, 7, 31)
+  , (2018, 7, 21)
+  , (2019, 8, 10)
+  , (2020, 7, 29)
+  , (2021, 7, 17)
+  , (2022, 8, 6)
+  , (2023, 7, 26)
+  , (2024, 8, 12)
+  , (2025, 8, 2)
+  , (2026, 7, 22)
+  , (2027, 8, 11)
+  , (2028, 7, 31)
+  , (2029, 7, 21)
+  , (2030, 8, 7)
+  , (2031, 7, 28)
+  , (2032, 7, 17)
+  , (2033, 8, 3)
+  , (2034, 7, 24)
+  , (2035, 8, 13)
+  , (2036, 8, 2)
+  , (2037, 7, 20)
+  , (2038, 8, 9)
+  , (2039, 7, 30)
+  , (2040, 7, 18)
+  , (2041, 8, 5)
+  , (2042, 7, 26)
+  , (2043, 8, 15)
+  , (2044, 8, 1)
+  , (2045, 7, 22)
+  , (2046, 8, 11)
+  , (2047, 7, 31)
+  , (2048, 7, 18)
+  , (2049, 8, 7)
+  , (2050, 7, 27)
+  ]
+
+yomHaatzmaut :: TimeData
+yomHaatzmaut = computedDays yomHaatzmaut'
+
+yomHaatzmaut' :: [TimeObject]
+yomHaatzmaut' = mapMaybe toTimeObjectM
+  [ (1950, 4, 19)
+  , (1951, 5, 9)
+  , (1952, 4, 29)
+  , (1953, 4, 19)
+  , (1954, 5, 5)
+  , (1955, 4, 26)
+  , (1956, 4, 15)
+  , (1957, 5, 5)
+  , (1958, 4, 23)
+  , (1959, 5, 12)
+  , (1960, 5, 1)
+  , (1961, 4, 19)
+  , (1962, 5, 8)
+  , (1963, 4, 28)
+  , (1964, 4, 15)
+  , (1965, 5, 5)
+  , (1966, 4, 24)
+  , (1967, 5, 14)
+  , (1968, 5, 1)
+  , (1969, 4, 22)
+  , (1970, 5, 10)
+  , (1971, 4, 28)
+  , (1972, 4, 18)
+  , (1973, 5, 6)
+  , (1974, 4, 24)
+  , (1975, 4, 15)
+  , (1976, 5, 4)
+  , (1977, 4, 20)
+  , (1978, 5, 10)
+  , (1979, 5, 1)
+  , (1980, 4, 20)
+  , (1981, 5, 6)
+  , (1982, 4, 27)
+  , (1983, 4, 17)
+  , (1984, 5, 6)
+  , (1985, 4, 24)
+  , (1986, 5, 13)
+  , (1987, 5, 3)
+  , (1988, 4, 20)
+  , (1989, 5, 9)
+  , (1990, 4, 29)
+  , (1991, 4, 17)
+  , (1992, 5, 6)
+  , (1993, 4, 25)
+  , (1994, 4, 13)
+  , (1995, 5, 3)
+  , (1996, 4, 23)
+  , (1997, 5, 11)
+  , (1998, 4, 29)
+  , (1999, 4, 20)
+  , (2000, 5, 9)
+  , (2001, 4, 25)
+  , (2002, 4, 16)
+  , (2003, 5, 6)
+  , (2004, 4, 26)
+  , (2005, 5, 11)
+  , (2006, 5, 2)
+  , (2007, 4, 23)
+  , (2008, 5, 7)
+  , (2009, 4, 28)
+  , (2010, 4, 19)
+  , (2011, 5, 9)
+  , (2012, 4, 25)
+  , (2013, 4, 15)
+  , (2014, 5, 5)
+  , (2015, 4, 22)
+  , (2016, 5, 11)
+  , (2017, 5, 1)
+  , (2018, 4, 18)
+  , (2019, 5, 8)
+  , (2020, 4, 28)
+  , (2021, 4, 14)
+  , (2022, 5, 4)
+  , (2023, 4, 25)
+  , (2024, 5, 13)
+  , (2025, 4, 30)
+  , (2026, 4, 21)
+  , (2027, 5, 11)
+  , (2028, 5, 1)
+  , (2029, 4, 18)
+  , (2030, 5, 7)
+  , (2031, 4, 28)
+  , (2032, 4, 14)
+  , (2033, 5, 3)
+  , (2034, 4, 24)
+  , (2035, 5, 14)
+  , (2036, 4, 30)
+  , (2037, 4, 20)
+  , (2038, 5, 10)
+  , (2039, 4, 27)
+  , (2040, 4, 17)
+  , (2041, 5, 6)
+  , (2042, 4, 23)
+  , (2043, 5, 13)
+  , (2044, 5, 2)
+  , (2045, 4, 19)
+  , (2046, 5, 9)
+  , (2047, 4, 30)
+  , (2048, 4, 15)
+  , (2049, 5, 5)
+  , (2050, 4, 26)
+  ]
+
+eidalAdha :: TimeData
+eidalAdha = computedDays eidalAdha'
+
+eidalAdha' :: [TimeObject]
+eidalAdha' = mapMaybe toTimeObjectM
+  [ (2000, 3, 16)
+  , (2001, 3, 5)
+  , (2002, 2, 22)
+  , (2003, 2, 11)
+  , (2004, 2, 1)
+  , (2005, 1, 21)
+  , (2006, 1, 10)
+  , (2006, 12, 31)
+  , (2007, 12, 20)
+  , (2008, 12, 8)
+  , (2009, 11, 27)
+  , (2011, 11, 6)
+  , (2012, 10, 26)
+  , (2013, 10, 15)
+  , (2014, 10, 4)
+  , (2015, 8, 23)
+  , (2016, 9, 11)
+  , (2017, 9, 1)
+  , (2018, 8, 21)
+  , (2019, 8, 11)
+  , (2020, 7, 31)
+  , (2021, 7, 20)
+  , (2022, 7, 9)
+  , (2023, 6, 28)
+  , (2024, 6, 16)
+  , (2025, 6, 6)
+  , (2026, 5, 27)
+  , (2027, 5, 16)
+  , (2028, 5, 5)
+  , (2029, 4, 24)
+  ]
+
+eidalFitr :: TimeData
+eidalFitr = computedDays eidalFitr'
+
+eidalFitr' :: [TimeObject]
+eidalFitr' = mapMaybe toTimeObjectM
+  [ (2000, 1, 8)
+  , (2000, 12, 27)
+  , (2001, 12, 16)
+  , (2002, 12, 5)
+  , (2003, 11, 25)
+  , (2004, 11, 14)
+  , (2005, 11, 3)
+  , (2006, 10, 23)
+  , (2007, 10, 13)
+  , (2008, 10, 1)
+  , (2009, 9, 20)
+  , (2010, 9, 10)
+  , (2011, 8, 30)
+  , (2012, 8, 19)
+  , (2013, 8, 8)
+  , (2014, 7, 28)
+  , (2015, 7, 17)
+  , (2016, 7, 6)
+  , (2017, 6, 25)
+  , (2018, 6, 15)
+  , (2019, 6, 4)
+  , (2020, 5, 24)
+  , (2021, 5, 13)
+  , (2022, 5, 2)
+  , (2023, 4, 21)
+  , (2024, 4, 10)
+  , (2025, 3, 30)
+  , (2026, 3, 20)
+  , (2027, 3, 9)
+  , (2028, 2, 26)
+  , (2029, 2, 14)
+  ]
+
+rajab :: TimeData
+rajab = computedDays rajab'
+
+rajab' :: [TimeObject]
+rajab' = mapMaybe toTimeObjectM
+  [ (1999, 10, 10)
+  , (2000, 9, 28)
+  , (2001, 9, 18)
+  , (2002, 9, 8)
+  , (2003, 8, 29)
+  , (2004, 8, 17)
+  , (2005, 8, 6)
+  , (2006, 7, 26)
+  , (2007, 7, 15)
+  , (2008, 7, 4)
+  , (2009, 6, 24)
+  , (2010, 6, 13)
+  , (2011, 6, 3)
+  , (2012, 5, 22)
+  , (2013, 5, 11)
+  , (2014, 4, 30)
+  , (2015, 4, 20)
+  , (2016, 4, 8)
+  , (2017, 3, 29)
+  , (2018, 3, 18)
+  , (2019, 3, 8)
+  , (2020, 2, 25)
+  , (2021, 2, 13)
+  , (2022, 2, 2)
+  , (2023, 1, 23)
+  , (2024, 1, 13)
+  , (2025, 1, 1)
+  , (2025, 12, 21)
+  , (2026, 12, 10)
+  , (2027, 11, 29)
+  , (2028, 11, 18)
+  ]
+
+muharram :: TimeData
+muharram = computedDays muharram'
+
+muharram' :: [TimeObject]
+muharram' = mapMaybe toTimeObjectM
+  [ (1998, 4, 27)
+  , (1999, 4, 17)
+  , (2000, 4, 6)
+  , (2001, 3, 26)
+  , (2002, 3, 15)
+  , (2003, 4, 4)
+  , (2004, 2, 21)
+  , (2005, 2, 10)
+  , (2006, 1, 31)
+  , (2007, 1, 20)
+  , (2008, 1, 10)
+  , (2009, 12, 18)
+  , (2010, 12, 7)
+  , (2011, 11, 26)
+  , (2012, 11, 15)
+  , (2013, 11, 4)
+  , (2014, 10, 25)
+  , (2015, 10, 14)
+  , (2016, 10, 2)
+  , (2017, 9, 21)
+  , (2018, 9, 11)
+  , (2019, 8, 31)
+  , (2020, 8, 20)
+  , (2021, 8, 9)
+  , (2022, 7, 30)
+  , (2023, 7, 19)
+  , (2024, 7, 7)
+  , (2025, 6, 26)
+  , (2026, 6, 16)
+  , (2027, 6, 6)
+  , (2028, 5, 25)
+  ]
+
+ramadan :: TimeData
+ramadan = computedDays ramadan'
+
+ramadan' :: [TimeObject]
+ramadan' = mapMaybe toTimeObjectM
+  [ (1999, 12, 9)
+  , (2000, 11, 27)
+  , (2001, 11, 16)
+  , (2002, 11, 6)
+  , (2003, 10, 26)
+  , (2004, 10, 15)
+  , (2005, 10, 4)
+  , (2006, 9, 24)
+  , (2007, 9, 13)
+  , (2008, 9, 1)
+  , (2009, 8, 22)
+  , (2010, 8, 11)
+  , (2011, 8, 1)
+  , (2012, 7, 20)
+  , (2013, 7, 9)
+  , (2014, 6, 28)
+  , (2015, 6, 18)
+  , (2016, 6, 6)
+  , (2017, 5, 27)
+  , (2018, 5, 16)
+  , (2019, 5, 6)
+  , (2020, 4, 24)
+  , (2021, 4, 13)
+  , (2022, 4, 2)
+  , (2023, 3, 23)
+  , (2024, 3, 11)
+  , (2025, 3, 1)
+  , (2026, 2, 18)
+  , (2027, 2, 8)
+  , (2028, 1, 28)
+  , (2029, 1, 16)
+  ]
+
+mawlid :: TimeData
+mawlid = computedDays mawlid'
+
+mawlid' :: [TimeObject]
+mawlid' = mapMaybe toTimeObjectM
+  [ (1999, 6, 26)
+  , (2000, 6, 14)
+  , (2001, 6, 4)
+  , (2002, 5, 24)
+  , (2003, 5, 13)
+  , (2004, 5, 1)
+  , (2005, 4, 21)
+  , (2006, 4, 10)
+  , (2007, 3, 31)
+  , (2008, 3, 20)
+  , (2009, 3, 9)
+  , (2010, 2, 26)
+  , (2011, 2, 15)
+  , (2012, 2, 4)
+  , (2013, 1, 24)
+  , (2014, 1, 13)
+  , (2015, 1, 3)
+  , (2015, 12, 23)
+  , (2016, 12, 11)
+  , (2017, 11, 30)
+  , (2018, 11, 20)
+  , (2019, 11, 9)
+  , (2020, 10, 29)
+  , (2021, 10, 18)
+  , (2022, 10, 8)
+  , (2023, 9, 27)
+  , (2024, 9, 15)
+  , (2025, 9, 4)
+  , (2026, 8, 25)
+  , (2027, 8, 14)
+  , (2028, 8, 3)
+  ]
+
+tuBishvat :: TimeData
+tuBishvat = computedDays tuBishvat'
+
+tuBishvat' :: [TimeObject]
+tuBishvat' = mapMaybe toTimeObjectM
+  [ (1950, 2, 1)
+  , (1951, 1, 21)
+  , (1952, 2, 10)
+  , (1953, 1, 30)
+  , (1954, 1, 18)
+  , (1955, 2, 6)
+  , (1956, 1, 27)
+  , (1957, 1, 16)
+  , (1958, 2, 4)
+  , (1959, 1, 23)
+  , (1960, 2, 12)
+  , (1961, 1, 31)
+  , (1962, 1, 19)
+  , (1963, 2, 8)
+  , (1964, 1, 28)
+  , (1965, 1, 17)
+  , (1966, 2, 4)
+  , (1967, 1, 25)
+  , (1968, 2, 13)
+  , (1969, 2, 2)
+  , (1970, 1, 21)
+  , (1971, 2, 9)
+  , (1972, 1, 30)
+  , (1973, 1, 17)
+  , (1974, 2, 6)
+  , (1975, 1, 26)
+  , (1976, 1, 16)
+  , (1977, 2, 2)
+  , (1978, 1, 22)
+  , (1979, 2, 11)
+  , (1980, 2, 1)
+  , (1981, 1, 19)
+  , (1982, 2, 7)
+  , (1983, 1, 28)
+  , (1984, 1, 18)
+  , (1985, 2, 5)
+  , (1986, 1, 24)
+  , (1987, 2, 13)
+  , (1988, 2, 2)
+  , (1989, 1, 20)
+  , (1990, 2, 9)
+  , (1991, 1, 29)
+  , (1992, 1, 19)
+  , (1993, 2, 5)
+  , (1994, 1, 26)
+  , (1995, 1, 15)
+  , (1996, 2, 4)
+  , (1997, 1, 22)
+  , (1998, 2, 10)
+  , (1999, 1, 31)
+  , (2000, 1, 21)
+  , (2001, 2, 7)
+  , (2002, 1, 27)
+  , (2003, 1, 17)
+  , (2004, 2, 6)
+  , (2005, 1, 24)
+  , (2006, 2, 12)
+  , (2007, 2, 2)
+  , (2008, 1, 21)
+  , (2009, 2, 8)
+  , (2010, 1, 29)
+  , (2011, 1, 19)
+  , (2012, 2, 7)
+  , (2013, 1, 25)
+  , (2014, 1, 15)
+  , (2015, 2, 3)
+  , (2016, 1, 24)
+  , (2017, 2, 10)
+  , (2018, 1, 30)
+  , (2019, 1, 20)
+  , (2020, 2, 9)
+  , (2021, 1, 27)
+  , (2022, 1, 16)
+  , (2023, 2, 5)
+  , (2024, 1, 24)
+  , (2025, 2, 12)
+  , (2026, 2, 1)
+  , (2027, 1, 22)
+  , (2028, 2, 11)
+  , (2029, 1, 30)
+  , (2030, 1, 18)
+  , (2031, 2, 7)
+  , (2032, 1, 27)
+  , (2033, 1, 14)
+  , (2034, 2, 3)
+  , (2035, 1, 24)
+  , (2036, 2, 12)
+  , (2037, 1, 30)
+  , (2038, 1, 20)
+  , (2039, 2, 8)
+  , (2040, 1, 29)
+  , (2041, 1, 16)
+  , (2042, 2, 4)
+  , (2043, 1, 25)
+  , (2044, 2, 12)
+  , (2045, 2, 1)
+  , (2046, 1, 21)
+  , (2047, 2, 10)
+  , (2048, 1, 29)
+  , (2049, 1, 17)
+  , (2050, 2, 6)
+  ]
+
+dhanteras :: TimeData
+dhanteras = computedDays dhanteras'
+
+dhanteras' :: [TimeObject]
+dhanteras' = mapMaybe toTimeObjectM
+  [ (2000, 10, 24)
+  , (2001, 11, 12)
+  , (2002, 11, 2)
+  , (2003, 10, 23)
+  , (2004, 11, 10)
+  , (2005, 10, 30)
+  , (2006, 10, 19)
+  , (2007, 11, 7)
+  , (2008, 10, 26)
+  , (2009, 10, 15)
+  , (2010, 11, 3)
+  , (2011, 10, 24)
+  , (2012, 11, 11)
+  , (2013, 11, 1)
+  , (2014, 10, 21)
+  , (2015, 11, 9)
+  , (2016, 10, 28)
+  , (2017, 10, 17)
+  , (2018, 11, 5)
+  , (2019, 10, 25)
+  , (2020, 11, 13)
+  , (2021, 11, 2)
+  , (2022, 10, 22)
+  , (2023, 11, 10)
+  , (2024, 10, 29)
+  , (2025, 10, 18)
+  , (2026, 11, 6)
+  , (2027, 10, 27)
+  , (2028, 10, 15)
+  , (2029, 11, 4)
+  , (2030, 10, 24)
+  ]
+
+navaratri :: TimeData
+navaratri = computedDays navaratri'
+
+navaratri' :: [TimeObject]
+navaratri' = mapMaybe toTimeObjectM
+  [ (2000, 9, 28)
+  , (2001, 10, 17)
+  , (2002, 10, 7)
+  , (2003, 9, 26)
+  , (2004, 10, 14)
+  , (2005, 10, 4)
+  , (2006, 9, 23)
+  , (2007, 10, 12)
+  , (2008, 9, 30)
+  , (2009, 9, 19)
+  , (2010, 10, 8)
+  , (2011, 9, 28)
+  , (2012, 10, 16)
+  , (2013, 10, 5)
+  , (2014, 9, 25)
+  , (2015, 10, 13)
+  , (2016, 10, 1)
+  , (2017, 9, 21)
+  , (2018, 10, 9)
+  , (2019, 9, 29)
+  , (2020, 10, 17)
+  , (2021, 10, 6)
+  , (2022, 9, 26)
+  , (2023, 10, 15)
+  , (2024, 10, 3)
+  , (2025, 9, 22)
+  , (2026, 10, 11)
+  , (2027, 9, 30)
+  , (2028, 9, 19)
+  , (2029, 10, 8)
+  , (2030, 9, 27)
+  ]
+
+rakshaBandhan :: TimeData
+rakshaBandhan = computedDays rakshaBandhan'
+
+rakshaBandhan' :: [TimeObject]
+rakshaBandhan' = mapMaybe toTimeObjectM
+  [ (2000, 8, 15)
+  , (2001, 8, 4)
+  , (2002, 8, 22)
+  , (2003, 8, 12)
+  , (2004, 8, 29)
+  , (2005, 8, 19)
+  , (2006, 8, 9)
+  , (2007, 8, 28)
+  , (2008, 8, 16)
+  , (2009, 8, 5)
+  , (2010, 8, 24)
+  , (2011, 8, 13)
+  , (2012, 8, 2)
+  , (2013, 8, 20)
+  , (2014, 8, 10)
+  , (2015, 8, 29)
+  , (2016, 8, 18)
+  , (2017, 8, 7)
+  , (2018, 8, 26)
+  , (2019, 8, 15)
+  , (2020, 8, 3)
+  , (2021, 8, 22)
+  , (2022, 8, 11)
+  , (2023, 8, 30)
+  , (2024, 8, 19)
+  , (2025, 8, 9)
+  , (2026, 8, 28)
+  , (2027, 8, 17)
+  , (2028, 8, 5)
+  , (2029, 8, 23)
+  , (2030, 8, 13)
+  ]
+
+thaiPongal :: TimeData
+thaiPongal = computedDays thaiPongal'
+
+thaiPongal' :: [TimeObject]
+thaiPongal' = mapMaybe toTimeObjectM
+  [ (2000, 1, 15)
+  , (2001, 1, 14)
+  , (2002, 1, 14)
+  , (2003, 1, 14)
+  , (2004, 1, 15)
+  , (2005, 1, 14)
+  , (2006, 1, 14)
+  , (2007, 1, 15)
+  , (2008, 1, 15)
+  , (2009, 1, 14)
+  , (2010, 1, 14)
+  , (2011, 1, 15)
+  , (2012, 1, 15)
+  , (2013, 1, 14)
+  , (2014, 1, 14)
+  , (2015, 1, 15)
+  , (2016, 1, 15)
+  , (2017, 1, 14)
+  , (2018, 1, 14)
+  , (2019, 1, 15)
+  , (2020, 1, 15)
+  , (2021, 1, 14)
+  , (2022, 1, 14)
+  , (2023, 1, 15)
+  , (2024, 1, 15)
+  , (2025, 1, 14)
+  , (2026, 1, 14)
+  , (2027, 1, 15)
+  , (2028, 1, 15)
+  , (2029, 1, 14)
+  , (2030, 1, 14)
+  ]
+
+thiruOnam :: TimeData
+thiruOnam = computedDays thiruOnam'
+
+thiruOnam' :: [TimeObject]
+thiruOnam' = mapMaybe toTimeObjectM
+  [ (2000, 9, 10)
+  , (2001, 8, 31)
+  , (2002, 8, 21)
+  , (2003, 9, 8)
+  , (2004, 8, 28)
+  , (2005, 9, 15)
+  , (2006, 9, 5)
+  , (2007, 8, 26)
+  , (2008, 9, 12)
+  , (2009, 9, 2)
+  , (2010, 8, 23)
+  , (2011, 9, 9)
+  , (2012, 8, 29)
+  , (2013, 8, 20)
+  , (2014, 9, 6)
+  , (2015, 8, 28)
+  , (2016, 9, 13)
+  , (2017, 9, 4)
+  , (2018, 8, 24)
+  , (2019, 9, 11)
+  , (2020, 8, 31)
+  , (2021, 8, 21)
+  , (2022, 9, 8)
+  , (2023, 8, 29)
+  , (2024, 9, 15)
+  , (2025, 9, 5)
+  , (2026, 8, 26)
+  , (2027, 9, 12)
+  , (2028, 9, 1)
+  , (2029, 8, 22)
+  , (2030, 9, 9)
+  ]
+
+vasantPanchami :: TimeData
+vasantPanchami = computedDays vasantPanchami'
+
+vasantPanchami' :: [TimeObject]
+vasantPanchami' = mapMaybe toTimeObjectM
+  [ (2000, 2, 10)
+  , (2001, 1, 29)
+  , (2002, 2, 17)
+  , (2003, 2, 6)
+  , (2004, 1, 26)
+  , (2005, 2, 13)
+  , (2006, 2, 2)
+  , (2007, 1, 23)
+  , (2008, 2, 11)
+  , (2009, 1, 31)
+  , (2010, 1, 20)
+  , (2011, 2, 8)
+  , (2012, 1, 28)
+  , (2013, 2, 15)
+  , (2014, 2, 4)
+  , (2015, 1, 24)
+  , (2016, 2, 12)
+  , (2017, 2, 1)
+  , (2018, 1, 22)
+  , (2019, 2, 10)
+  , (2020, 1, 29)
+  , (2021, 2, 16)
+  , (2022, 2, 5)
+  , (2023, 1, 26)
+  , (2024, 2, 14)
+  , (2025, 2, 2)
+  , (2026, 1, 23)
+  , (2027, 2, 11)
+  , (2028, 1, 31)
+  , (2029, 1, 19)
+  , (2030, 2, 7)
+  ]
diff --git a/Duckling/Time/Corpus.hs b/Duckling/Time/Corpus.hs
--- a/Duckling/Time/Corpus.hs
+++ b/Duckling/Time/Corpus.hs
@@ -11,7 +11,9 @@
 
 module Duckling.Time.Corpus
   ( datetime
+  , datetimeHoliday
   , datetimeInterval
+  , datetimeIntervalHoliday
   , datetimeOpenInterval
   , examples
   ) where
@@ -29,29 +31,49 @@
 import Duckling.TimeGrain.Types hiding (add)
 import Duckling.Types hiding (Entity(..))
 
-datetime :: Datetime -> Grain -> Context -> SingleTimeValue
-datetime d g ctx =
-  timeValue tzSeries TimeObject {start = dt d, end = Nothing, grain = g}
-  where
-    DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
+datetime :: Datetime -> Grain -> Context -> TimeValue
+datetime d g ctx = datetimeIntervalHolidayHelper (d, Nothing) g Nothing ctx
 
-datetimeInterval :: (Datetime, Datetime) -> Grain -> Context -> SingleTimeValue
-datetimeInterval (d1, d2) g ctx = timeValue tzSeries TimeObject
-  {start = dt d1, end = Just $ dt d2, grain = g}
+datetimeHoliday :: Datetime -> Grain -> Text -> Context -> TimeValue
+datetimeHoliday d g h ctx =
+  datetimeIntervalHolidayHelper (d, Nothing) g (Just h) ctx
+
+datetimeInterval :: (Datetime, Datetime) -> Grain -> Context -> TimeValue
+datetimeInterval (d1, d2) g ctx =
+  datetimeIntervalHolidayHelper (d1, Just d2) g Nothing ctx
+
+datetimeIntervalHoliday ::
+  (Datetime, Datetime) -> Grain -> Text -> Context -> TimeValue
+datetimeIntervalHoliday (d1, d2) g h ctx =
+  datetimeIntervalHolidayHelper (d1, Just d2) g (Just h) ctx
+
+datetimeIntervalHolidayHelper ::
+  (Datetime, Maybe Datetime) -> Grain -> Maybe Text -> Context -> TimeValue
+datetimeIntervalHolidayHelper (d1, md2) g hol ctx = TimeValue tv [tv] hol
   where
     DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
+    tv = timeValue tzSeries TimeObject {start = dt d1, end = d, grain = g}
+    d = case md2 of
+      Nothing -> Nothing
+      Just d2 -> Just $ dt d2
 
 datetimeOpenInterval
-  :: IntervalDirection -> Datetime -> Grain -> Context -> SingleTimeValue
-datetimeOpenInterval dir d g ctx = openInterval tzSeries dir TimeObject
-  {start = dt d, end = Nothing, grain = g}
+  :: IntervalDirection -> Datetime -> Grain -> Context -> TimeValue
+datetimeOpenInterval dir d g ctx = TimeValue tv [tv] Nothing
   where
     DucklingTime (Series.ZoneSeriesTime _ tzSeries) = referenceTime ctx
+    tv = openInterval tzSeries dir TimeObject
+      {start = dt d, end = Nothing, grain = g}
 
+
 check :: ToJSON a => (Context -> a) -> TestPredicate
 check f context Resolved{jsonValue} = case jsonValue of
-  Object o -> toJSON (f context) == (Object $ H.delete "values" o)
+  Object o -> deleteValues (toJSON (f context)) == deleteValues (Object o)
   _ -> False
+  where
+    deleteValues :: Value -> Value
+    deleteValues (Object o) = Object $ H.delete "values" o
+    deleteValues _ = Object H.empty
 
 examples :: ToJSON a => (Context -> a) -> [Text] -> [Example]
 examples f = examplesCustom (check f)
diff --git a/Duckling/Time/DA/Corpus.hs b/Duckling/Time/DA/Corpus.hs
--- a/Duckling/Time/DA/Corpus.hs
+++ b/Duckling/Time/DA/Corpus.hs
@@ -23,7 +23,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale DA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale DA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/DE/Corpus.hs b/Duckling/Time/DE/Corpus.hs
--- a/Duckling/Time/DE/Corpus.hs
+++ b/Duckling/Time/DE/Corpus.hs
@@ -24,10 +24,10 @@
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale DE Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale DE Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale DE Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale DE Nothing}, testOptions, examples)
   where
     examples =
       [ "ein Hotel"
@@ -413,37 +413,36 @@
   , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
              [ "diesen winter"
              ]
-  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "Weihnachten")
              [ "Weihnachten"
              , "Weihnachtstag"
              ]
-  , examples (datetime (2013, 12, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 31, 0, 0, 0) Day "Silvester")
              [ "Silvester"
              ]
-  , examples (datetime (2014, 1, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "Neujahr")
              [ "Neujahrstag"
              , "Neujahr"
              ]
-  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 2, 14, 0, 0, 0) Day "Valentinstag")
              [ "Valentinstag"
              ]
-  , examples (datetime (2013, 5, 12, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Muttertag" )
              [ "Muttertag"
              ]
-  , examples (datetime (2013, 6, 16, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Vatertag" )
              [ "Vatertag"
              ]
-  , examples (datetime (2013, 10, 3, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 3, 0, 0, 0) Day "Tag der Deutschen Einheit")
              [ "Tag der Deutschen Einheit"
-             , "3. Oktober"
              ]
-  , examples (datetime (2013, 10, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 31, 0, 0, 0) Day "Halloween")
              [ "Halloween"
              ]
-  , examples (datetime (2013, 11, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 1, 0, 0, 0) Day "Allerheiligen" )
              [ "Allerheiligen"
              ]
-  , examples (datetime (2013, 12, 6, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 6, 0, 0, 0) Day "Nikolaus")
              [ "Nikolaus"
              , "Nikolaustag"
              ]
diff --git a/Duckling/Time/DE/Rules.hs b/Duckling/Time/DE/Rules.hs
--- a/Duckling/Time/DE/Rules.hs
+++ b/Duckling/Time/DE/Rules.hs
@@ -80,9 +80,9 @@
 
 ruleHolidays :: [Rule]
 ruleHolidays = mkRuleHolidays
-  [ ( "new year's day"                    , "neujahr(s?tag)?"
+  [ ( "Neujahr"                           , "neujahr(s?tag)?"
     , monthDay  1  1 )
-  , ( "valentine's day"                   , "valentin'?stag"
+  , ( "Valentinstag"                      , "valentin'?stag"
     , monthDay  2 14 )
   , ( "Schweizer Bundesfeiertag"
     , "schweiz(er)? (bundes)?feiertag|bundes feiertag"
@@ -92,21 +92,21 @@
   , ( "Oesterreichischer Nationalfeiertag"
     , "((ö)sterreichischer?)? nationalfeiertag|national feiertag"
     , monthDay 10 26 )
-  , ( "halloween day"                     , "hall?owe?en?"
+  , ( "Halloween"                         , "hall?owe?en?"
     , monthDay 10 31 )
   , ( "Allerheiligen"                     , "allerheiligen?|aller heiligen?"
     , monthDay 11  1 )
   , ( "Nikolaus"                          , "nikolaus(tag)?|nikolaus tag|nikolo"
     , monthDay 12  6 )
-  , ( "christmas eve"                     , "heilig(er)? abend"
+  , ( "Heiligabend"                       , "heilig(er)? abend"
     , monthDay 12 24 )
-  , ( "christmas"                         , "weih?nacht(en|stag)?"
+  , ( "Weihnachten"                       , "weih?nacht(en|stag)?"
     , monthDay 12 25 )
-  , ( "new year's eve"                    , "silvester"
+  , ( "Silvester"                         , "silvester"
     , monthDay 12 31 )
-  , ( "Mother's Day"                      , "mutt?ertag|mutt?er (tag)?"
+  , ( "Muttertag"                      , "mutt?ertag|mutt?er (tag)?"
     , nthDOWOfMonth 2 7 5 )
-  , ( "Father's Day"                      , "vatt?er( ?tag)?"
+  , ( "Vatertag"                      , "vatt?er( ?tag)?"
     , nthDOWOfMonth 3 7 6 )
   ]
 
diff --git a/Duckling/Time/EL/Corpus.hs b/Duckling/Time/EL/Corpus.hs
--- a/Duckling/Time/EL/Corpus.hs
+++ b/Duckling/Time/EL/Corpus.hs
@@ -27,10 +27,10 @@
 context = testContext {locale = makeLocale EL Nothing}
 
 corpus :: Corpus
-corpus = (context, allExamples)
+corpus = (context, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (context, examples)
+negativeCorpus = (context, testOptions, examples)
   where
     examples =
       [ "ένας ενήληκας"
diff --git a/Duckling/Time/EN/AU/Corpus.hs b/Duckling/Time/EN/AU/Corpus.hs
--- a/Duckling/Time/EN/AU/Corpus.hs
+++ b/Duckling/Time/EN/AU/Corpus.hs
@@ -33,6 +33,7 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
@@ -41,25 +42,66 @@
              [ "10/10"
              , "10/10/2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 4, 25, 0, 0, 0) Day "ANZAC Day")
+             [ "anzac day"
+             ]
+  , examples (datetimeHoliday (2013, 9, 1, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 9, 2, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 9, 1, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeIntervalHoliday ((2020, 2, 8, 0, 0, 0), (2020, 2, 11, 0, 0, 0)) Day "Royal Hobart Regatta")
+             [ "Royal Hobart Regatta 2020"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 7, 8, 0, 0, 0), (2018, 7, 16, 0, 0, 0)) Day "NAIDOC Week")
+             [ "NAIDOC week 2018"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 10, 7, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 10, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
+             ]
+  , examples (datetimeHoliday (2018, 5, 28, 0, 0, 0) Day "Reconciliation Day")
+             [ "reconciliation day 2018"
+             ]
+  , examples (datetimeHoliday (2019, 5, 27, 0, 0, 0) Day "Reconciliation Day")
+             [ "reconciliation day 2019"
              ]
   ]
diff --git a/Duckling/Time/EN/AU/Rules.hs b/Duckling/Time/EN/AU/Rules.hs
--- a/Duckling/Time/EN/AU/Rules.hs
+++ b/Duckling/Time/EN/AU/Rules.hs
@@ -20,9 +20,12 @@
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Regex.Types
+import Duckling.Time.Computed (easterSunday)
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
+import qualified Duckling.Time.Types as TTime
+import qualified Duckling.TimeGrain.Types as TG
 
 ruleDDMM :: Rule
 ruleDDMM = Rule
@@ -42,7 +45,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +72,76 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "ANZAC Day", "anzac day", monthDay 4 25 )
+  , ( "Australia Day", "(ana|anniversary|australia|foundation) day"
+    , monthDay 1 26 )
+  , ( "Harmony Day", "harmony day", monthDay 3 21 )
+  , ( "National Sorry Day", "national sorry day", monthDay 5 26 )
+  , ( "Queensland Day", "queensland day", monthDay 6 6 )
+  , ( "Remembrance Day", "remembrance day", monthDay 11 11 )
+  , ( "Take our Daughters and Sons to Work Day"
+    , "take our daughters and sons to work day", monthDay 1 5 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Adelaide Cup", "adelaide cup", nthDOWOfMonth 2 1 3 )
+  , ( "Administrative Professionals' Day"
+    , "(admin(istrative professionals'?)|secretaries'?) day"
+    , nthDOWOfMonth 1 5 5 )
+  , ( "Canberra Day", "canberra day", nthDOWOfMonth 2 1 3 )
+  , ( "Eight Hours Day", "eight hours day", nthDOWOfMonth 2 1 3 )
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 1 7 9 )
+  , ( "Labour Day", "labour day", nthDOWOfMonth 1 1 10 )
+  , ( "Melbourne Cup Day", "melbourne cup day", nthDOWOfMonth 1 2 11 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "National Close the Gap Day", "national close the gap day"
+    , nthDOWOfMonth 3 4 3 )
+  , ( "National Tree Day", "(arbor|national tree) day"
+    , predLastOf (dayOfWeek 7) (month 6) )
+  , ( "National Schools Tree Day", "national schools tree day"
+    , predLastOf (dayOfWeek 5) (month 6) )
+  , ( "New South Wales Bank Holiday", "new south wales bank holiday"
+    , nthDOWOfMonth 1 1 8 )
+  , ( "Picnic Day", "(northern territory )?picnic day", nthDOWOfMonth 1 1 8 )
+  , ( "Recreation Day", "recreation day", nthDOWOfMonth 1 1 10 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  , ( "Western Australia Day", "western australia day", nthDOWOfMonth 1 1 6 )
+
+  -- Other
+  , ( "Reconciliation Day", "reconciliation\\s+day"
+    , predNthAfter 0 (dayOfWeek 1) (monthDay 5 26) )
+  ]
+
+rulePeriodicHolidays' :: [Rule]
+rulePeriodicHolidays' = mkRuleHolidays'
+  -- Fixed day/week/month, year over year
+  -- Week from Sunday of July until following Sunday that has the second Friday
+  [ ( "NAIDOC Week"
+    , "(naidoc|national aboriginal and islander day observance committee) week"
+    , let fri = nthDOWOfMonth 2 5 7
+          start = cycleNthAfter False TG.Day (- 5) fri
+          end = cycleNthAfter False TG.Day 2 fri
+      in interval TTime.Open start end )
+  -- 3 days ending on the second Monday of February
+  , ( "Royal Hobart Regatta", "royal hobart regatta"
+    , let end = nthDOWOfMonth 2 1 2
+      in interval TTime.Open (cycleNthAfter False TG.Day (- 2) end) end )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Easter Tuesday", "easter\\s+tue(sday)?"
+    , cycleNthAfter False TG.Day 2 easterSunday )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ ruleComputedHolidays
+  ++ rulePeriodicHolidays
+  ++ rulePeriodicHolidays'
diff --git a/Duckling/Time/EN/BZ/Corpus.hs b/Duckling/Time/EN/BZ/Corpus.hs
--- a/Duckling/Time/EN/BZ/Corpus.hs
+++ b/Duckling/Time/EN/BZ/Corpus.hs
@@ -33,6 +33,7 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
@@ -41,25 +42,54 @@
              [ "10/10"
              , "10/10/2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 11, 19, 0, 0, 0) Day "Garifuna Settlement Day")
+             [ "garifuna settlement day"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
              ]
   ]
diff --git a/Duckling/Time/EN/BZ/Rules.hs b/Duckling/Time/EN/BZ/Rules.hs
--- a/Duckling/Time/EN/BZ/Rules.hs
+++ b/Duckling/Time/EN/BZ/Rules.hs
@@ -42,7 +42,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +69,26 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Garifuna Settlement Day", "garifuna settlement day", monthDay 11 19 )
+  , ( "Labour Day", "labour day", monthDay 5 1 )
+  , ( "National Heroes and Benefactors Day"
+    , "national heroes and benefactors day", monthDay 3 9 )
+  , ( "Pan American Day", "pan american day", monthDay 10 12 )
+  , ( "St. George's Caye Day", "st\\.? george'?s caye day", monthDay 9 10 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/CA/Corpus.hs b/Duckling/Time/EN/CA/Corpus.hs
--- a/Duckling/Time/EN/CA/Corpus.hs
+++ b/Duckling/Time/EN/CA/Corpus.hs
@@ -33,29 +33,114 @@
              , "10/31/74"
              , "10-31-74"
              , "10.31.1974"
+             , "10 31 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "4/25 at 4:00pm"
              ]
-  , examples (datetime (2013, 10, 14, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 14, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 10, 13, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 10, 13, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 10, 8, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 10, 8, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 10, 10, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 10, 10, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 10, 9, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 10, 9, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 7, 1, 0, 0, 0) Day "Memorial Day")
+             [ "canada day"
+             , "memorial day"
+             , "dominion day"
+             , "Next Memorial Day"
+             ]
+  , examples (datetimeHoliday (2013, 4, 9, 0, 0, 0) Day "Vimy Ridge Day")
+             [ "vimy ridge day"
+             ]
+  , examples (datetimeHoliday (2013, 7, 12, 0, 0, 0) Day "The Twelfth")
+             [ "the Glorious Twelfth"
+             , "Orangemen's Day"
+             , "the twelfth"
+             ]
+  , examples (datetimeHoliday (2013, 6, 24, 0, 0, 0) Day "Discovery Day")
+             [ "discovery day"
+             , "next discovery  day"
+             ]
+  , examples (datetimeHoliday (2018, 6, 25, 0, 0, 0) Day "Discovery Day")
+             [ "discovery day 2018"
+             ]
+  , examples (datetimeHoliday (2020, 6, 22, 0, 0, 0) Day "Discovery Day")
+             [ "discovery   day 2020"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2018, 5, 21, 0, 0, 0) Day "Victoria Day")
+             [ "Victoria day 2018"
+             , "Sovereign's birthday 2018"
+             ]
+  , examples (datetimeHoliday (2013, 8, 5, 0, 0, 0) Day "Civic Holiday")
+             [ "Civic Holiday"
+             , "British Columbia Day"
+             , "Natal Day"
+             , "New Brunswick Day"
+             , "Saskatchewan Day"
+             , "Terry Fox Day"
+             ]
+  , examples (datetimeHoliday (2018, 2, 19, 0, 0, 0) Day "Family Day")
+             [ "family day 2018"
+             , "islander day 2018"
+             , "louis riel day 2018"
+             , "nova scotia heritage day 2018"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2017, 5, 22, 0, 0, 0) Day "National Patriots' Day")
+             [ "national patriots' day 2017"
+             ]
+  , examples (datetimeHoliday (2018, 5, 21, 0, 0, 0) Day "National Patriots' Day")
+             [ "national patriots' day 2018"
+             ]
+  , examples (datetimeHoliday (2019, 5, 20, 0, 0, 0) Day "National Patriots' Day")
+             [ "national patriots' day 2019"
+             ]
+  , examples (datetimeHoliday (2013, 9, 2, 0, 0, 0) Day "Labour Day")
+             [ "labor day"
+             ]
+  , examples (datetimeHoliday (2012, 9, 3, 0, 0, 0) Day "Labour Day")
+             [ "labor day of last year"
+             , "Labour Day 2012"
+             ]
+  , examples (datetimeIntervalHoliday ((2013, 8, 30, 18, 0, 0), (2013, 9, 3, 0, 0, 0)) Hour "Labour Day weekend")
+             [ "labor day weekend"
+             ]
+  , examples (datetimeHoliday (2013, 2, 2, 0, 0, 0) Day "Groundhog Day")
+             [ "Groundhog day"
+             , "groundhogs day"
              ]
   ]
diff --git a/Duckling/Time/EN/CA/Rules.hs b/Duckling/Time/EN/CA/Rules.hs
--- a/Duckling/Time/EN/CA/Rules.hs
+++ b/Duckling/Time/EN/CA/Rules.hs
@@ -44,7 +44,7 @@
 ruleMMDDYYYY = Rule
   { name = "mm/dd/yyyy"
   , pattern =
-    [ regex "(1[0-2]|0?[1-9])[/-](3[01]|[12]\\d|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(1[0-2]|0?[1-9])[-/\\s](3[01]|[12]\\d|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (mm:dd:yy:_)):_) -> do
@@ -71,20 +71,63 @@
       _ -> Nothing
   }
 
--- Second Monday of October
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 2 1 10
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Anniversary of the Statute of Westminster", "anniversary of the statute of westminster", monthDay 12 11 )
+  , ( "Memorial Day", "(canada|dominion|memorial) day", monthDay 7 1 )
+  , ( "Groundhog Day", "groundhogs? day", monthDay 2 2 )
+  , ( "Healthcare Aide Day", "healthcare aide day", monthDay 10 18 )
+  , ( "National Aboriginal Day", "national aboriginal day", monthDay 6 21 )
+  , ( "National Flag of Canada Day", "national flag of canada day", monthDay 2 15 )
+  , ( "National Tartan Day", "national tartan day", monthDay 4 6 )
+  , ( "Nunavut Day", "nunavut day", monthDay 7 9 )
+  , ( "Remembrance Day", "remembrance day", monthDay 11 11 )
+  , ( "St David's Day", "st\\.? david'?s day", monthDay 3 1 )
+  , ( "St. Jean Baptiste Day", "st\\.? jean baptiste day", monthDay 6 24 )
+  , ( "The Twelfth", "orangemen's day|the (glorious )?twelfth", monthDay 7 12 )
+  , ( "Victoria Day", "sovereign's birthday|victoria day"
+    , predLastOf (dayOfWeek 1) (monthDay 5 25) )
+  , ( "Vimy Ridge Day", "vimy ridge day", monthDay 4 9 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Civic Holiday"
+    , "british columbia day|civic holiday|natal day|new brunswick day|Saskatchewan Day|terry fox day"
+    , nthDOWOfMonth 1 1 8
+    )
+  , ( "Family Day"
+    , "(family|islander|louis riel|nova scotia heritage) day"
+    , nthDOWOfMonth 3 1 2 )
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Gold Cup Parade", "gold cup parade", nthDOWOfMonth 3 5 8 )
+  , ( "Heritage Day in Alberta", "heritage day in alberta", nthDOWOfMonth 1 1 8 )
+  , ( "Labour Day", "labou?r day", nthDOWOfMonth 1 1 9 )
+  -- Long weekend before the first Monday of September
+  , ( "Labour Day weekend", "labou?r day week(\\s|-)?ends?"
+    , longWEBefore $ nthDOWOfMonth 1 1 9
+    )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "Royal St. John's Regatta", "regatta day|royal st\\.? john's regatta"
+    , nthDOWOfMonth 1 3 8 )
+  , ( "Take our Daughters and Sons to Work Day"
+    , "take our daughters and sons to work day", nthDOWOfMonth 1 3 11 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 2 1 10 )
+  , ( "Yukon's Discovery Day", "(klondike gold|yukon's) discovery day"
+    , nthDOWOfMonth 3 1 8 )
+
+  -- Monday before May 25th
+  , ( "National Patriots' Day", "national patriot'?s'? day"
+    , predNthAfter (-1) (dayOfWeek 1) (monthDay 5 25) )
+
+  -- Closest Monday to June 24th
+  , ( "Discovery Day", "discovery\\s+day"
+    , predNthClosest 0 (dayOfWeek 1) (monthDay 6 24) )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleMMDD
   , ruleMMDDYYYY
   , ruleMMDDYYYYDot
-  , ruleThanksgiving
   ]
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/Corpus.hs b/Duckling/Time/EN/Corpus.hs
--- a/Duckling/Time/EN/Corpus.hs
+++ b/Duckling/Time/EN/Corpus.hs
@@ -12,21 +12,23 @@
   ( corpus
   , defaultCorpus
   , negativeCorpus
+  , latentCorpus
   ) where
 
 import Data.String
 import Prelude
 
+import Duckling.Resolve
 import Duckling.Testing.Types hiding (examples)
 import Duckling.Time.Corpus
 import Duckling.Time.Types hiding (Month)
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 defaultCorpus :: Corpus
-defaultCorpus = (testContext, allExamples ++ custom)
+defaultCorpus = (testContext, testOptions, allExamples ++ custom)
   where
     custom = concat
       [ examples (datetime (2013, 2, 15, 0, 0, 0) Day)
@@ -45,31 +47,37 @@
       , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
                  [ "4/25 at 4:00pm"
                  ]
-      , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+      , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
                  [ "thanksgiving day"
                  , "thanksgiving"
                  , "thanksgiving 2013"
                  , "this thanksgiving"
                  , "next thanksgiving day"
+                 , "thanksgiving in 9 months"
+                 , "thanksgiving 9 months from now"
                  ]
-      , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+      , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
                  [ "thanksgiving of next year"
+                 , "thanksgiving in a year"
                  , "thanksgiving 2014"
                  ]
-      , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+      , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
                  [ "last thanksgiving"
                  , "thanksgiving day 2012"
+                 , "thanksgiving 3 months ago"
+                 , "thanksgiving 1 year ago"
                  ]
-      , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+      , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
                  [ "thanksgiving 2016"
+                 , "thanksgiving in 3 years"
                  ]
-      , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+      , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
                  [ "thanksgiving 2017"
                  ]
       ]
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "laughing out loud"
@@ -77,7 +85,6 @@
       , "we are separated"
       , "25"
       , "this is the one"
-      , "in 61"
       , "this one"
       , "this past one"
       , "at single"
@@ -94,8 +101,44 @@
       , "at 650.650.6500"
       , "at 650-650-6500"
       , "two sixty a m"
+      , "Pay ABC 2000"
       ]
 
+latentCorpus :: Corpus
+latentCorpus = (testContext, testOptions {withLatent = True}, xs)
+  where
+    xs = concat
+      [ examples (datetime (2013, 2, 24, 0, 0, 0) Day)
+                 [ "the 24"
+                 , "On 24th"
+                 ]
+      , examples (datetime (2013, 2, 12, 7, 0, 0) Hour)
+                 [ "7"
+                 ]
+      --, examples (datetime (1954, 1, 1, 0, 0, 0) Year)
+      --           [ "1954"
+      --           ]
+      , examples (datetime (2013, 5, 1, 0, 0, 0) Month)
+                 [ "May"
+                 ]
+      , examples (datetimeInterval
+          ((2013, 2, 12, 4, 0, 0), (2013, 2, 12, 12, 0, 0)) Hour)
+                 [ "morning"
+                 ]
+      , examples (datetimeInterval
+          ((2013, 2, 12, 12, 0, 0), (2013, 2, 12, 19, 0, 0)) Hour)
+                 [ "afternoon"
+                 ]
+      , examples (datetimeInterval
+          ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+                 [ "evening"
+                 ]
+      , examples (datetimeInterval
+          ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+                 [ "night"
+                 ]
+      ]
+
 allExamples :: [Example]
 allExamples = concat
   [ examples (datetime (2013, 2, 12, 4, 30, 0) Second)
@@ -110,6 +153,9 @@
   , examples (datetime (2013, 2, 1, 0, 0, 0) Day)
              [ "2/2013"
              ]
+  , examples (datetime (2014, 1, 1, 0, 0, 0) Year)
+             [ "in 2014"
+             ]
   , examples (datetime (2013, 2, 11, 0, 0, 0) Day)
              [ "yesterday"
              ]
@@ -184,6 +230,10 @@
   , examples (datetime (2013, 8, 8, 0, 0, 0) Day)
              [ "Aug 8"
              ]
+  , examples (datetime (2014, 3, 1, 0, 0, 0) Month)
+             [ "March in 1 year"
+             , "March in a year"
+             ]
   , examples (datetime (2014, 7, 18, 0, 0, 0) Day)
              [ "Fri, Jul 18"
              , "Jul 18, Fri"
@@ -236,6 +286,18 @@
   , examples (datetime (2013, 3, 1, 0, 0, 0) Month)
              [ "next month"
              ]
+  , examples (datetime (2013, 3, 20, 0, 0, 0) Day)
+             [ "20 of next month"
+             , "20th of the next month"
+             , "20th day of next month"
+             ]
+  , examples (datetime (2013, 2, 20, 0, 0, 0) Day)
+             [ "20th of the current month"
+             , "20 of this month"
+             ]
+  , examples (datetime (2013, 1, 20, 0, 0, 0) Day)
+             [ "20th of the previous month"
+             ]
   , examples (datetime (2013, 1, 1, 0, 0, 0) Quarter)
              [ "this quarter"
              , "this qtr"
@@ -364,6 +426,9 @@
              [ "3:18am"
              , "3:18a"
              ]
+  , examples (datetime (2016, 2, 1, 7, 0, 0) Hour)
+             [ "at 7 in 3 years"
+             ]
   , examples (datetime (2013, 2, 12, 15, 0, 0) Hour)
              [ "at 3pm"
              , "@ 3pm"
@@ -536,9 +601,6 @@
   , examples (datetime (2011, 2, 1, 0, 0, 0) Month)
              [ "two years ago"
              ]
-  , examples (datetime (1954, 1, 1, 0, 0, 0) Year)
-             [ "1954"
-             ]
   , examples (datetime (2013, 2, 19, 4, 0, 0) Hour)
              [ "7 days hence"
              ]
@@ -574,94 +636,152 @@
   , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
              [ "this winter"
              ]
-  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
+  , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 19, 0, 0, 0)) Day)
+             [ "this season"
+             , "current seasons"
+             ]
+  , examples (datetimeInterval ((2012, 9, 23, 0, 0, 0), (2012, 12, 20, 0, 0, 0)) Day)
+             [ "last season"
+             , "past seasons"
+             , "previous seasons"
+             ]
+  , examples (datetimeInterval ((2013, 3, 20, 0, 0, 0), (2013, 6, 20, 0, 0, 0)) Day)
+             [ "next season"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 18, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "last night"
+             , "yesterday evening"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 21, 0, 0), (2013, 2, 12, 0, 0, 0)) Hour)
+             [ "late last night"
+             ]
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "Christmas")
              [ "xmas"
              , "christmas"
              , "christmas day"
              ]
-  , examples (datetime (2013, 12, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 25, 18, 0, 0) Hour "Christmas")
+             [ "xmas at 6 pm"
+             ]
+  , examples (datetimeIntervalHoliday ((2013, 12, 25, 4, 0, 0), (2013, 12, 25, 12, 0, 0)) Hour "Christmas")
+             [ "morning of xmas"
+             , "morning of christmas 2013"
+             , "morning of this christmas day"
+             ]
+  , examples (datetimeHoliday (2013, 12, 31, 0, 0, 0) Day "New Year's Eve")
              [ "new year's eve"
              , "new years eve"
              ]
-  , examples (datetime (2014, 1, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "New Year's Day")
              [ "new year's day"
              , "new years day"
              ]
-  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 2, 14, 0, 0, 0) Day "Valentine's Day")
              [ "valentine's day"
              , "valentine day"
              ]
-  , examples (datetime (2013, 5, 12, 0, 0, 0) Day)
-             [ "Mother's Day"
-             , "next mothers day"
-             ]
-  , examples (datetime (2012, 5, 13, 0, 0, 0) Day)
-             [ "last mothers day"
-             ]
-  , examples (datetime (2014, 5, 11, 0, 0, 0) Day)
-             [ "mothers day 2014"
-             ]
-  , examples (datetime (2013, 6, 16, 0, 0, 0) Day)
-             [ "Father's Day"
-             ]
-  , examples (datetime (2012, 6, 17, 0, 0, 0) Day)
-             [ "last fathers day"
-             ]
-  , examples (datetime (1996, 6, 16, 0, 0, 0) Day)
-             [ "fathers day 1996"
-             ]
-  , examples (datetime (2013, 5, 27, 0, 0, 0) Day)
-             [ "memorial day"
-             , "Next Memorial Day"
-             ]
-  , examples (datetime (2012, 5, 28, 0, 0, 0) Day)
-             [ "last memorial day"
-             , "memorial day of last year"
-             ]
-  , examples (datetimeInterval ((2013, 5, 24, 18, 0, 0), (2013, 5, 28, 0, 0, 0)) Hour)
-             [ "memorial day week-end"
-             ]
   , examples (datetime (2013, 7, 4, 0, 0, 0) Day)
-             [ "independence day"
-             , "4th of July"
+             [ "4th of July"
              , "4 of july"
              ]
-  , examples (datetime (2013, 9, 2, 0, 0, 0) Day)
-             [ "labor day"
-             ]
-  , examples (datetime (2012, 9, 3, 0, 0, 0) Day)
-             [ "labor day of last year"
-             , "Labor Day 2012"
-             ]
-  , examples (datetimeInterval ((2013, 8, 30, 18, 0, 0), (2013, 9, 3, 0, 0, 0)) Hour)
-             [ "labor day weekend"
-             ]
-  , examples (datetime (2013, 10, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 31, 0, 0, 0) Day "Halloween")
              [ "halloween"
              , "next halloween"
              , "Halloween 2013"
              ]
-  , examples (datetime (2013, 11, 29, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 29, 0, 0, 0) Day "Black Friday")
              [ "black friday"
              , "black friday of this year"
              , "black friday 2013"
              ]
-  , examples (datetime (2017, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 24, 0, 0, 0) Day "Black Friday")
              [ "black friday 2017"
              ]
-  , examples (datetime (2014, 1, 20, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 16, 0, 0, 0) Day "Boss's Day")
+             [ "boss's day"
+             , "boss's"
+             , "boss day"
+             , "next boss's day"
+             ]
+  , examples (datetimeHoliday (2016, 10, 17, 0, 0, 0) Day "Boss's Day")
+             [ "boss's day 2016"
+             ]
+  , examples (datetimeHoliday (2021, 10, 15, 0, 0, 0) Day "Boss's Day")
+             [ "boss's day 2021"
+             ]
+  , examples (datetimeHoliday (2014, 1, 20, 0, 0, 0) Day "Martin Luther King's Day")
              [ "MLK day"
              , "next Martin Luther King day"
              , "this MLK day"
              ]
-  , examples (datetime (2013, 1, 21, 0, 0, 0) Day)
-             [ "last MLK day"
+  , examples (datetimeHoliday (2013, 1, 21, 0, 0, 0) Day "Martin Luther King's Day")
+             [ "last MLK Jr. day"
              , "MLK day 2013"
              ]
-  , examples (datetime (2012, 1, 16, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 1, 16, 0, 0, 0) Day "Martin Luther King's Day")
              [ "MLK day of last year"
              , "MLK day 2012"
+             , "Civil Rights Day of last year"
              ]
+  , examples (datetimeHoliday (2013, 11, 1, 0, 0, 0) Day "World Vegan Day")
+             [ "world vegan day"
+             ]
+  , examples (datetimeHoliday (2013, 3, 31, 0, 0, 0) Day "Easter Sunday")
+             [ "easter"
+             , "easter 2013"
+             ]
+ , examples (datetimeHoliday (2012, 4, 08, 0, 0, 0) Day "Easter Sunday")
+             [ "last easter"
+             ]
+  , examples (datetimeHoliday (2013, 4, 1, 0, 0, 0) Day "Easter Monday")
+             [ "easter mon"
+             ]
+  , examples (datetimeHoliday (2010, 4, 4, 0, 0, 0) Day "Easter Sunday")
+             [ "easter 2010"
+             , "Easter Sunday two thousand ten"
+             ]
+  , examples (datetime (2013, 4, 3, 0, 0, 0) Day)
+             [ "three days after Easter"
+             ]
+  , examples (datetimeHoliday (2013, 3, 28, 0, 0, 0) Day "Maundy Thursday")
+             [ "Maundy Thursday"
+             , "Covenant thu"
+             , "Thu of Mysteries"
+             ]
+  , examples (datetimeHoliday (2013, 5, 19, 0, 0, 0) Day "Pentecost")
+             [ "Pentecost"
+             , "white sunday 2013"
+             ]
+  , examples (datetimeHoliday (2013, 5, 20, 0, 0, 0) Day "Whit Monday")
+             [ "whit monday"
+             , "Monday of the Holy Spirit"
+             ]
+  , examples (datetimeHoliday (2013, 3, 24, 0, 0, 0) Day "Palm Sunday")
+             [ "palm sunday"
+             , "branch sunday 2013"
+             ]
+  , examples (datetimeHoliday (2013, 5, 26, 0, 0, 0) Day "Trinity Sunday")
+             [ "trinity sunday"
+             ]
+  , examples (datetimeHoliday (2013, 2, 12, 0, 0, 0) Day "Shrove Tuesday")
+             [ "pancake day 2013"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 2, 14, 0, 0, 0), (2018, 4, 1, 0, 0, 0)) Day "Lent")
+             [ "lent 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 8, 0, 0, 0) Day "Orthodox Easter Sunday")
+             [ "orthodox easter 2018"
+             ]
+  , examples (datetimeHoliday (2018, 2, 19, 0, 0, 0) Day "Clean Monday")
+             [ "clean monday 2018"
+             , "orthodox shrove monday two thousand eighteen"
+             ]
+  , examples (datetimeHoliday (2018, 3, 31, 0, 0, 0) Day "Lazarus Saturday")
+             [ "lazarus saturday 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 2, 19, 0, 0, 0), (2018, 3, 31, 0, 0, 0)) Day "Great Lent")
+             [ "great fast 2018"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 18, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
              [ "this evening"
              , "today evening"
@@ -691,6 +811,10 @@
              , "monday early morning"
              , "monday in the early hours of the morning"
              ]
+  , examples (datetimeInterval ((2013, 2, 12, 21, 0, 0), (2013, 2, 13, 0, 0, 0)) Hour)
+             [ "late tonight"
+             , "late tonite"
+             ]
   , examples (datetimeInterval ((2013, 2, 15, 4, 0, 0), (2013, 2, 15, 12, 0, 0)) Hour)
              [ "february the 15th in the morning"
              , "15 of february in the morning"
@@ -778,6 +902,12 @@
              , "between 9:30 and 11:00 on thursday"
              , "between 9:30 and 11:00 on thursday"
              , "between 9:30 and 11:00 on thursday"
+             , "between 9:30 and 11:00 on thursday"
+             , "between 9:30 and 11:00 on thursday"
+             , "between 9:30 and 11:00 on thursday"
+             , "between 9:30 and 11:00 on thursday"
+             , "between 9:30 and 11:00 on thursday"
+             , "between 9:30 and 11:00 on thursday"
              , "9:30 - 11:00 on Thursday"
              , "later than 9:30 but before 11:00 on Thursday"
              , "Thursday from 9:30 to 11:00"
@@ -821,7 +951,26 @@
              ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 3, 1, 0, 0, 0)) Second)
              [ "by EOM"
+             , "by the EOM"
+             , "by end of the month"
+             , "by the end of month"
              ]
+  , examples (datetimeInterval ((2013, 2, 21, 0, 0, 0), (2013, 3, 1, 0, 0, 0)) Day)
+             [ "EOM"
+             , "the EOM"
+             , "at the EOM"
+             , "the end of the month"
+             , "end of the month"
+             , "at the end of month"
+             ]
+  , examples (datetimeInterval ((2013, 2, 1, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Day)
+             [ "BOM"
+             , "the BOM"
+             , "at the BOM"
+             , "beginning of the month"
+             , "the beginning of the month"
+             , "at the beginning of month"
+             ]
   , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2013, 4, 1, 0, 0, 0)) Second)
              [ "by the end of next month"
              ]
@@ -978,5 +1127,261 @@
              ]
   , examples (datetimeInterval ((2013, 8, 19, 0, 0, 0), (2013, 8, 22, 0, 0, 0)) Day)
              [ "19th To 21st aug"
+             ]
+  , examples (datetimeInterval ((2013, 4, 21, 0, 0, 0), (2013, 5, 1, 0, 0, 0)) Day)
+             [ "end of April"
+             , "at the end of April"
+             ]
+  , examples (datetimeInterval ((2014, 1, 1, 0, 0, 0), (2014, 1, 11, 0, 0, 0)) Day)
+             [ "beginning of January"
+             , "at the beginning of January"
+             ]
+  , examples (datetimeInterval ((2012, 9, 1, 0, 0, 0), (2013, 1, 1, 0, 0, 0)) Month)
+             [ "end of 2012"
+             , "at the end of 2012"
+             ]
+  , examples (datetimeInterval ((2017, 1, 1, 0, 0, 0), (2017, 4, 1, 0, 0, 0)) Month)
+             [ "beginning of 2017"
+             , "at the beginning of 2017"
+             ]
+  , examples (datetimeInterval ((2013, 1, 1, 0, 0, 0), (2013, 4, 1, 0, 0, 0)) Month)
+             [ "beginning of year"
+             , "the beginning of the year"
+             , "the BOY"
+             , "BOY"
+             ]
+  , examples (datetimeInterval ((2013, 2, 12, 4, 30, 0), (2014, 1, 1, 0, 0, 0)) Second)
+             [ "by EOY"
+             , "by the EOY"
+             , "by end of the year"
+             , "by the end of year"
+             ]
+  , examples (datetimeInterval ((2013, 9, 1, 0, 0, 0), (2014, 1, 1, 0, 0, 0)) Month)
+             [ "EOY"
+             , "the EOY"
+             , "at the EOY"
+             , "the end of the year"
+             , "end of the year"
+             , "at the end of year"
+             ]
+  , examples (datetimeInterval ((2013, 2, 11, 0, 0, 0), (2013, 2, 14, 0, 0, 0)) Day)
+             [ "beginning of this week"
+             , "beginning of current week"
+             , "beginning of coming week"
+             , "at the beginning of this week"
+             , "at the beginning of current week"
+             , "at the beginning of coming week"
+             ]
+  , examples (datetimeInterval ((2013, 2, 4, 0, 0, 0), (2013, 2, 7, 0, 0, 0)) Day)
+             [ "beginning of last week"
+             , "beginning of past week"
+             , "beginning of previous week"
+             , "at the beginning of last week"
+             , "at the beginning of past week"
+             , "at the beginning of previous week"
+             ]
+  , examples (datetimeInterval ((2013, 2, 18, 0, 0, 0), (2013, 2, 21, 0, 0, 0)) Day)
+             [ "beginning of next week"
+             , "beginning of the following week"
+             , "beginning of around next week"
+             , "at the beginning of next week"
+             , "at the beginning of the following week"
+             , "at the beginning of around next week"
+             ]
+  , examples (datetimeInterval ((2013, 2, 15, 0, 0, 0), (2013, 2, 18, 0, 0, 0)) Day)
+             [ "end of this week"
+             , "end of current week"
+             , "end of coming week"
+             , "at the end of this week"
+             , "at the end of current week"
+             , "at the end of coming week"
+             ]
+  , examples (datetimeInterval ((2013, 2, 8, 0, 0, 0), (2013, 2, 11, 0, 0, 0)) Day)
+             [ "end of last week"
+             , "end of past week"
+             , "end of previous week"
+             , "at the end of last week"
+             , "at the end of past week"
+             , "at the end of previous week"
+             ]
+  , examples (datetimeInterval ((2013, 2, 22, 0, 0, 0), (2013, 2, 25, 0, 0, 0)) Day)
+             [ "end of next week"
+             , "end of the following week"
+             , "end of around next week"
+             , "at the end of next week"
+             , "at the end of the following week"
+             , "at the end of around next week"
+             ]
+  , examples (datetimeHoliday (2014, 1, 31, 0, 0, 0) Day "Chinese New Year")
+             [ "chinese new year"
+             , "chinese lunar new year's day"
+             ]
+  , examples (datetimeHoliday (2013, 2, 10, 0, 0, 0) Day "Chinese New Year")
+             [ "last chinese new year"
+             , "last chinese lunar new year's day"
+             ]
+  , examples (datetimeHoliday (2018, 2, 16, 0, 0, 0) Day "Chinese New Year")
+             [ "chinese new year's day 2018"
+             ]
+  , examples (datetimeHoliday (2018, 9, 18, 0, 0, 0) Day "Yom Kippur")
+             [ "yom kippur 2018"
+             ]
+  , examples (datetimeHoliday (2018, 9, 30, 0, 0, 0) Day "Shemini Atzeret")
+             [ "shemini atzeret 2018"
+             ]
+  , examples (datetimeHoliday (2018, 10, 1, 0, 0, 0) Day "Simchat Torah")
+             [ "simchat torah 2018"
+             ]
+  , examples (datetimeHoliday (2018, 7, 21, 0, 0, 0) Day "Tisha B'Av")
+             [ "tisha b'av 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 18, 0, 0, 0) Day "Yom Ha'atzmaut")
+             [ "yom haatzmaut 2018"
+             ]
+  , examples (datetimeHoliday (2017, 5, 13, 0, 0, 0) Day "Lag BaOmer")
+             [ "lag b'omer 2017"
+             ]
+  , examples (datetimeHoliday (2018, 4, 11, 0, 0, 0) Day "Yom HaShoah")
+             [ "Yom Hashoah 2018"
+             , "Holocaust Day 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 9, 9, 0, 0, 0), (2018, 9, 12, 0, 0, 0)) Day "Rosh Hashanah")
+             [ "rosh hashanah 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 12, 2, 0, 0, 0), (2018, 12, 10, 0, 0, 0)) Day "Hanukkah")
+             [ "Chanukah 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 3, 30, 0, 0, 0), (2018, 4, 8, 0, 0, 0)) Day "Passover")
+             [ "passover 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 9, 23, 0, 0, 0), (2018, 10, 2, 0, 0, 0)) Day "Sukkot")
+             [ "feast of the ingathering 2018"
+             , "succos 2018"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 5, 19, 0, 0, 0), (2018, 5, 22, 0, 0, 0)) Day "Shavuot")
+             [ "shavuot 2018"
+             ]
+  , examples (datetimeHoliday (2017, 11, 30, 0, 0, 0) Day "Mawlid")
+             [ "mawlid al-nabawi 2017"
+             ]
+  , examples (datetimeHoliday (2018, 6, 15, 0, 0, 0) Day "Eid al-Fitr")
+             [ "Eid al-Fitr 2018"
+             ]
+  , examples (datetimeHoliday (2018, 8, 21, 0, 0, 0) Day "Eid al-Adha")
+             [ "Eid al-Adha 2018"
+             , "id ul-adha 2018"
+             , "sacrifice feast 2018"
+             , "Bakr Id 2018"
+             ]
+  , examples (datetimeHoliday (2017, 6, 22, 0, 0, 0) Day "Laylat al-Qadr")
+             [ "laylat al kadr 2017"
+             , "night of measures 2017"
+             ]
+  , examples (datetimeHoliday (2018, 6, 11, 0, 0, 0) Day "Laylat al-Qadr")
+             [ "laylat al-qadr 2018"
+             , "night of power 2018"
+             ]
+  , examples (datetimeHoliday (2018, 9, 11, 0, 0, 0) Day "Islamic New Year")
+             [ "Islamic New Year 2018"
+             , "Amun Jadid 2018"
+             ]
+  , examples (datetimeHoliday (2017, 9, 30, 0, 0, 0) Day "Ashura")
+             [ "day of Ashura 2017"
+             ]
+  , examples (datetimeHoliday (2018, 1, 30, 0, 0, 0) Day "Tu BiShvat")
+             [ "tu bishvat 2018"
+             ]
+  , examples (datetimeHoliday (2017, 6, 23, 0, 0, 0) Day "Jumu'atul-Wida")
+             [ "Jamat Ul-Vida 2017"
+             , "Jumu'atul-Wida 2017"
+             ]
+  , examples (datetimeHoliday (2018, 6, 8, 0, 0, 0) Day "Jumu'atul-Wida")
+             [ "Jamat Ul-Vida 2018"
+             , "Jumu'atul-Wida 2018"
+             ]
+  , examples (datetimeHoliday (2018, 4, 13, 0, 0, 0) Day "Isra and Mi'raj")
+             [ "isra and mi'raj 2018"
+             , "the prophet's ascension 2018"
+             ]
+  , examples (datetimeHoliday (2019, 4, 3, 0, 0, 0) Day "Isra and Mi'raj")
+             [ "the night journey 2019"
+             , "ascension to heaven 2019"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 5, 16, 0, 0, 0), (2018, 6, 15, 0, 0, 0)) Day "Ramadan")
+             [ "Ramadan 2018"
+             ]
+  , examples (datetimeHoliday (2017, 10, 17, 0, 0, 0) Day "Dhanteras")
+             [ "dhanatrayodashi in 2017"
+             ]
+  , examples (datetimeHoliday (2019, 10, 25, 0, 0, 0) Day "Dhanteras")
+             [ "dhanteras 2019"
+             ]
+  , examples (datetimeHoliday (2019, 10, 26, 0, 0, 0) Day "Naraka Chaturdashi")
+             [ "kali chaudas 2019"
+             , "choti diwali two thousand nineteen"
+             ]
+  , examples (datetimeHoliday (2019, 10, 27, 0, 0, 0) Day "Diwali")
+             [ "diwali 2019"
+             , "Deepavali in 2019"
+             , "Lakshmi Puja six years hence"
+             ]
+  , examples (datetimeHoliday (2019, 10, 29, 0, 0, 0) Day "Bhai Dooj")
+             [ "bhai dooj 2019"
+             ]
+  , examples (datetimeHoliday (2019, 11, 2, 0, 0, 0) Day "Chhath")
+             [ "chhath 2019"
+             , "dala puja 2019"
+             , "Surya Shashthi in 2019"
+             ]
+  , examples (datetimeHoliday (2021, 10, 12, 0, 0, 0) Day "Maha Saptami")
+             [ "Maha Saptami 2021"
+             ]
+  , examples (datetimeHoliday (2018, 10, 18, 0, 0, 0) Day "Vijayadashami")
+             [ "Dussehra 2018"
+             , "vijayadashami in five years"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 10, 9, 0, 0, 0), (2018, 10, 19, 0, 0, 0)) Day "Navaratri")
+             [ "navaratri 2018"
+             , "durga puja in 2018"
+             ]
+  , examples (datetimeHoliday (2018, 8, 26, 0, 0, 0) Day "Raksha Bandhan")
+             [ "rakhi 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 14, 0, 0, 0) Day "Thai Pongal")
+             [ "pongal 2018"
+             , "makara sankranthi 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 13, 0, 0, 0) Day "Boghi")
+             [ "bogi pandigai 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 15, 0, 0, 0) Day "Mattu Pongal")
+             [ "maattu pongal 2018"
+             ]
+  , examples (datetimeHoliday (2018, 1, 16, 0, 0, 0) Day "Kaanum Pongal")
+             [ "kaanum pongal 2018"
+             , "kanni pongal 2018"
+             ]
+  , examples (datetimeHoliday (2019, 1, 15, 0, 0, 0) Day "Thai Pongal")
+             [ "makar sankranti 2019"
+             , "maghi in 2019"
+             ]
+  , examples (datetimeHoliday (2018, 8, 24, 0, 0, 0) Day "Thiru Onam")
+             [ "onam 2018"
+             , "Thiru Onam 2018"
+             , "Thiruvonam 2018"
+             ]
+  , examples (datetimeHoliday (2019, 2, 10, 0, 0, 0) Day "Vasant Panchami")
+             [ "vasant panchami in 2019"
+             , "basant panchami 2019"
+             ]
+  , examples (datetimeHoliday (2019, 3, 20, 0, 0, 0) Day "Holika Dahan")
+             [ "chhoti holi 2019"
+             , "holika dahan 2019"
+             , "kamudu pyre 2019"
+             ]
+  , examples (datetimeHoliday (2019, 3, 21, 0, 0, 0) Day "Holi")
+             [ "holi 2019"
+             , "dhulandi 2019"
+             , "phagwah 2019"
              ]
   ]
diff --git a/Duckling/Time/EN/GB/Corpus.hs b/Duckling/Time/EN/GB/Corpus.hs
--- a/Duckling/Time/EN/GB/Corpus.hs
+++ b/Duckling/Time/EN/GB/Corpus.hs
@@ -33,33 +33,66 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
+  , examples (datetime (2013, 10, 10, 0, 0, 0) Day)
+             [ "10/10"
+             , "10/10/2013"
+             ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
              ]
-  , examples (datetime (2013, 10, 10, 0, 0, 0) Day)
-             [ "10/10"
-             , "10/10/2013"
+  , examples (datetimeHoliday (2013, 11, 5, 0, 0, 0) Day "Guy Fawkes Day")
+             [ "guy fawkes day"
+             ]
+  , examples (datetimeHoliday (2018, 8, 27, 0, 0, 0) Day "August Bank Holiday")
+             [ "august bank holiday 2018"
+             , "summer bank holiday 2018"
+             , "late summer bank holiday 2018"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 3, 10, 0, 0, 0) Day "Mothering Sunday")
+             [ "Mother's Day"
+             , "next mothers day"
+             , "mothering sunday"
+             ]
+  , examples (datetimeHoliday (2012, 3, 18, 0, 0, 0) Day "Mothering Sunday")
+             [ "mothers day 2012"
+             , "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 3, 30, 0, 0, 0) Day "Mothering Sunday")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 5, 19, 0, 0, 0) Day "Pentecost")
+             [ "whitsunday"
              ]
   ]
diff --git a/Duckling/Time/EN/GB/Rules.hs b/Duckling/Time/EN/GB/Rules.hs
--- a/Duckling/Time/EN/GB/Rules.hs
+++ b/Duckling/Time/EN/GB/Rules.hs
@@ -20,9 +20,11 @@
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Regex.Types
+import Duckling.Time.Computed (easterSunday)
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
 
 ruleDDMM :: Rule
 ruleDDMM = Rule
@@ -42,7 +44,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +71,41 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Bank Holiday", "bank holiday", monthDay 12 28 )
+  , ( "Battle of the Boyne", "battle of the boyne", monthDay 7 12 )
+  , ( "Burns Night", "burns night", monthDay 1 25 )
+  , ( "Guy Fawkes Day", "guy fawkes day", monthDay 11 5 )
+  , ( "Shakespeare Day", "shakespeare day", monthDay 4 23 )
+  , ( "St Andrew's Day", "st\\.? andrew'?s day", monthDay 11 30 )
+  , ( "St. David's Day", "st\\.? david'?s day", monthDay 3 1 )
+  , ( "Victory in Europe Day", "victory in europe day", monthDay 5 8 )
 
+  -- Fixed day/week/month, year over year
+  , ( "August Bank Holiday", "(august|(late )?summer) bank holiday"
+    , predLastOf (dayOfWeek 1) (month 8) )
+  , ( "Early May Bank Holiday", "early may bank holiday", nthDOWOfMonth 1 1 5 )
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Remembrance Sunday", "remembrance sunday", nthDOWOfMonth 2 7 11 )
+  , ( "Spring Bank Holiday", "(sprint|late may) bank holiday"
+    , predLastOf (dayOfWeek 1) (month 5) )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  -- 3 weeks before Easter
+  [ ( "Mothering Sunday", "mothering sunday|mother'?s?'? day"
+    , cycleNthAfter False TG.Day (-21) easterSunday )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ ruleComputedHolidays
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/IE/Corpus.hs b/Duckling/Time/EN/IE/Corpus.hs
--- a/Duckling/Time/EN/IE/Corpus.hs
+++ b/Duckling/Time/EN/IE/Corpus.hs
@@ -33,6 +33,7 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
@@ -41,25 +42,55 @@
              [ "10/10"
              , "10/10/2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2018, 8, 6, 0, 0, 0) Day "August Bank Holiday")
+             [ "august bank holiday 2018"
+             , "summer bank holiday 2018"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 5, 6, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 7, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
              ]
   ]
diff --git a/Duckling/Time/EN/IE/Rules.hs b/Duckling/Time/EN/IE/Rules.hs
--- a/Duckling/Time/EN/IE/Rules.hs
+++ b/Duckling/Time/EN/IE/Rules.hs
@@ -42,7 +42,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +69,25 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed day/week/month, year over year
+  [ ( "August Bank Holiday", "(august|summer) bank holiday"
+    , nthDOWOfMonth 1 1 8 )
+  , ( "Early May Bank Holiday", "early may bank holiday", nthDOWOfMonth 1 1 5 )
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "June Bank Holiday", "june bank holiday", nthDOWOfMonth 1 1 6 )
+  , ( "Labour Day", "labour day", nthDOWOfMonth 1 1 5 )
+  , ( "October Bank Holiday", "october (bank )?holiday"
+    , predLastOf (dayOfWeek 1) (month 10) )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
 
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/IN/Corpus.hs b/Duckling/Time/EN/IN/Corpus.hs
--- a/Duckling/Time/EN/IN/Corpus.hs
+++ b/Duckling/Time/EN/IN/Corpus.hs
@@ -33,6 +33,7 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
@@ -41,25 +42,66 @@
              [ "10/10"
              , "10/10/2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 2, 19, 0, 0, 0) Day "Shivaji Jayanti")
+             [ "shivaji jayanti 2013"
+             ]
+  , examples (datetimeHoliday (2013, 8, 15, 0, 0, 0) Day "Independence Day")
+             [ "independence day"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
+             ]
+  , examples (datetimeHoliday (2018, 3, 30, 0, 0, 0) Day "Hazarat Ali's Birthday")
+             [ "Hazarat Ali's Birthday 2018"
+             ]
+  , examples (datetimeHoliday (2019, 3, 20, 0, 0, 0) Day "Hazarat Ali's Birthday")
+             [ "Hazarat Ali's Birthday 2019"
+             ]
+  , examples (datetimeIntervalHoliday ((2018, 5, 16, 0, 0, 0), (2018, 6, 15, 0, 0, 0)) Day "Ramadan")
+             [ "ramzaan 2018"
              ]
   ]
diff --git a/Duckling/Time/EN/IN/Rules.hs b/Duckling/Time/EN/IN/Rules.hs
--- a/Duckling/Time/EN/IN/Rules.hs
+++ b/Duckling/Time/EN/IN/Rules.hs
@@ -20,9 +20,11 @@
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Regex.Types
+import Duckling.Time.Computed
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
 
 ruleDDMM :: Rule
 ruleDDMM = Rule
@@ -42,7 +44,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +71,35 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Guru Tegh Bahadur's Martyrdom Day", "guru tegh bahadur'?s martyrdom day"
+    , monthDay 11 24 )
+  , ( "Independence Day", "independence day", monthDay 8 15 )
+  , ( "Labour Day", "labour day", monthDay 5 1 )
+  , ( "Mahatma Gandhi Jayanti", "mahatma gandhi jayanti", monthDay 10 2 )
+  , ( "Republic Day", "republic day", monthDay 1 26 )
+  , ( "Shivaji Jayanti", "shivaji jayanti", monthDay 2 19 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Friendship Day", "friendship day", nthDOWOfMonth 1 7 8 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Hazarat Ali's Birthday", "hazarat ali's birthday"
+    , cycleNthAfter False TG.Day 12 rajab )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ ruleComputedHolidays
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/JM/Corpus.hs b/Duckling/Time/EN/JM/Corpus.hs
--- a/Duckling/Time/EN/JM/Corpus.hs
+++ b/Duckling/Time/EN/JM/Corpus.hs
@@ -33,6 +33,7 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
@@ -41,25 +42,54 @@
              [ "10/10"
              , "10/10/2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 5, 23, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 23, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
+             ]
+  , examples (datetimeHoliday (2013, 10, 21, 0, 0, 0) Day "Heroes' Day")
+             [ "heroes' day"
              ]
   ]
diff --git a/Duckling/Time/EN/JM/Rules.hs b/Duckling/Time/EN/JM/Rules.hs
--- a/Duckling/Time/EN/JM/Rules.hs
+++ b/Duckling/Time/EN/JM/Rules.hs
@@ -42,7 +42,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +69,22 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Labour Day", "labour day", monthDay 5 23 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Heroes' Day", "heroes' day", nthDOWOfMonth 3 1 10 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/NZ/Corpus.hs b/Duckling/Time/EN/NZ/Corpus.hs
--- a/Duckling/Time/EN/NZ/Corpus.hs
+++ b/Duckling/Time/EN/NZ/Corpus.hs
@@ -33,6 +33,7 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
@@ -41,25 +42,54 @@
              [ "10/10"
              , "10/10/2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 4, 25, 0, 0, 0) Day "ANZAC Day")
+             [ "ANZAC day"
+             ]
+  , examples (datetimeHoliday (2013, 9, 1, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 9, 2, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 9, 1, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday  (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 10, 28, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 10, 22, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
              ]
   ]
diff --git a/Duckling/Time/EN/NZ/Rules.hs b/Duckling/Time/EN/NZ/Rules.hs
--- a/Duckling/Time/EN/NZ/Rules.hs
+++ b/Duckling/Time/EN/NZ/Rules.hs
@@ -20,9 +20,11 @@
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Regex.Types
+import Duckling.Time.Computed (easterSunday)
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
 
 ruleDDMM :: Rule
 ruleDDMM = Rule
@@ -42,7 +44,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +71,35 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "ANZAC Day", "anzac day", monthDay 4 25 )
+  , ( "Guy Fawkes Night", "guy fawkes night", monthDay 11 5 )
+  , ( "Waitangi Day", "waitangi day", monthDay 2 6 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Administrative Professionals' Day"
+    , "(admin(istrative professionals'?)|secretaries'?) day"
+    , nthDOWOfMonth 3 3 4 )
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 1 7 9 )
+  , ( "Labour Day", "labour day", nthDOWOfMonth 4 1 10 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "Queen's birthday", "queen's birthday", nthDOWOfMonth 1 1 6 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Easter Tuesday", "easter\\s+tue(sday)?"
+    , cycleNthAfter False TG.Day 2 easterSunday )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ ruleComputedHolidays
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/PH/Corpus.hs b/Duckling/Time/EN/PH/Corpus.hs
--- a/Duckling/Time/EN/PH/Corpus.hs
+++ b/Duckling/Time/EN/PH/Corpus.hs
@@ -33,29 +33,65 @@
              , "10/31/74"
              , "10-31-74"
              , "10.31.1974"
+             , "10 31 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "4/25 at 4:00pm"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 12, 30, 0, 0, 0) Day "Rizal Day")
+             [ "Rizal day"
+             ]
+  , examples (datetimeHoliday (2013, 6, 12, 0, 0, 0) Day "Independence Day")
+             [ "Independence day"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
+             ]
+  , examples (datetimeHoliday (2013, 8, 26, 0, 0, 0) Day "National Heroes' Day")
+             [ "national heroes' day"
              ]
   ]
diff --git a/Duckling/Time/EN/PH/Rules.hs b/Duckling/Time/EN/PH/Rules.hs
--- a/Duckling/Time/EN/PH/Rules.hs
+++ b/Duckling/Time/EN/PH/Rules.hs
@@ -42,7 +42,7 @@
 ruleMMDDYYYY = Rule
   { name = "mm/dd/yyyy"
   , pattern =
-    [ regex "(1[0-2]|0?[1-9])[/-](3[01]|[12]\\d|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(1[0-2]|0?[1-9])[-/\\s](3[01]|[12]\\d|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (mm:dd:yy:_)):_) -> do
@@ -69,20 +69,33 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Arbor Day", "arbor day", monthDay 6 25 )
+  , ( "Bonifacio Day", "bonifacio day", monthDay 11 30 )
+  , ( "Independence Day", "independence day", monthDay 6 12 )
+  , ( "Labour Day", "labour day", monthDay 5 1 )
+  , ( "Ninoy Aquino Day", "ninoy aquino day", monthDay 8 21 )
+  , ( "People Power Anniversary", "(edsa revolution|people power) anniversary"
+    , monthDay 2 25 )
+  , ( "Rizal Day", "rizal day", monthDay 12 30 )
+  , ( "The Day of Valor", "the day of valor", monthDay 4 9 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "National Elections Day", "national elections day", nthDOWOfMonth 2 1 5 )
+  , ( "National Heroes' Day", "(national )?heroes' day"
+    , predLastOf (dayOfWeek 1) (month 8) )
+  , ( "Parents' Day", "parents' day", nthDOWOfMonth 1 1 12 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleMMDD
   , ruleMMDDYYYY
   , ruleMMDDYYYYDot
-  , ruleThanksgiving
   ]
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/Rules.hs b/Duckling/Time/EN/Rules.hs
--- a/Duckling/Time/EN/Rules.hs
+++ b/Duckling/Time/EN/Rules.hs
@@ -7,6 +7,7 @@
 
 
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE LambdaCase #-}
 {-# LANGUAGE NamedFieldPuns #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE OverloadedStrings #-}
@@ -27,6 +28,7 @@
 import Duckling.Numeral.Types (NumeralData (..))
 import Duckling.Ordinal.Types (OrdinalData (..))
 import Duckling.Regex.Types
+import Duckling.Time.Computed
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
@@ -41,10 +43,11 @@
   { name = "intersect"
   , pattern =
     [ Predicate isNotLatent
-    , Predicate isNotLatent
+    , Predicate $ or . sequence [isNotLatent, isGrainOfTime TG.Year]
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td1:Token Time td2:_) -> Token Time <$> intersect td1 td2
+      (Token Time td1:Token Time td2:_) ->
+        Token Time . notLatent <$> intersect td1 td2
       _ -> Nothing
   }
 
@@ -54,10 +57,11 @@
   , pattern =
     [ Predicate isNotLatent
     , regex "of|from|for|'s|,"
-    , Predicate isNotLatent
+    , Predicate $ or . sequence [isNotLatent, isGrainOfTime TG.Year]
     ]
   , prod = \tokens -> case tokens of
-      (Token Time td1:_:Token Time td2:_) -> Token Time <$> intersect td1 td2
+      (Token Time td1:_:Token Time td2:_) ->
+        Token Time . notLatent <$> intersect td1 td2
       _ -> Nothing
   }
 
@@ -85,15 +89,15 @@
       _ -> Nothing
   }
 
-ruleAbsorbInMonth :: Rule
-ruleAbsorbInMonth = Rule
-  { name = "in <named-month>"
+ruleAbsorbInMonthYear :: Rule
+ruleAbsorbInMonthYear = Rule
+  { name = "in <named-month>|year"
   , pattern =
     [ regex "in"
-    , Predicate isAMonth
+    , Predicate $ or . sequence [isAMonth, isGrainOfTime TG.Year]
     ]
   , prod = \tokens -> case tokens of
-      (_:token:_) -> Just token
+      (_:Token Time td:_) -> tt $ notLatent td
       _ -> Nothing
   }
 
@@ -115,8 +119,6 @@
   , ("today"        , TG.Day   , 0  , "todays?|(at this time)"           )
   , ("tomorrow"     , TG.Day   , 1  , "(tmrw?|tomm?or?rows?)"            )
   , ("yesterday"    , TG.Day   , - 1, "yesterdays?"                      )
-  , ("end of month" , TG.Month , 1  , "(the )?(EOM|end of (the )?month)" )
-  , ("end of year"  , TG.Year  , 1  , "(the )?(EOY|end of (the )?year)"  )
   ]
 
 ruleNow :: Rule
@@ -231,6 +233,21 @@
       _ -> Nothing
   }
 
+ruleLastNight :: Rule
+ruleLastNight = Rule
+  { name = "last night"
+  , pattern =
+    [ regex "(late )?last night"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) ->
+        let hours = if Text.toLower match == "late " then 3 else 6
+            start = durationBefore (DurationData hours TG.Hour) end
+            end = cycleNth TG.Day 0
+        in Token Time . partOfDay . notLatent <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
 ruleNthTimeOfTime :: Rule
 ruleNthTimeOfTime = Rule
   { name = "nth <time> of <time>"
@@ -293,42 +310,20 @@
       _ -> Nothing
   }
 
-ruleYear :: Rule
-ruleYear = Rule
-  { name = "year"
-  , pattern = [Predicate $ isIntegerBetween 1000 2100]
+ruleYearLatent :: Rule
+ruleYearLatent = Rule
+  { name = "year (latent)"
+  , pattern =
+      [ Predicate $
+        or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 10000]
+      ]
   , prod = \tokens -> case tokens of
       (token:_) -> do
         n <- getIntValue token
-        tt $ year n
+        tt . mkLatent $ year n
       _ -> Nothing
   }
 
-ruleYearPastLatent :: Rule
-ruleYearPastLatent = Rule
- { name = "past year (latent)"
- , pattern =
-   [ Predicate $
-       or . sequence [isIntegerBetween (- 10000) 0, isIntegerBetween 25 999]
-   ]
- , prod = \tokens -> case tokens of
-     (token:_) -> do
-       n <- getIntValue token
-       tt . mkLatent $ year n
-     _ -> Nothing
- }
-
-ruleYearFutureLatent :: Rule
-ruleYearFutureLatent = Rule
- { name = "future year (latent)"
- , pattern = [Predicate $ isIntegerBetween 2101 10000]
- , prod = \tokens -> case tokens of
-     (token:_) -> do
-       n <- getIntValue token
-       tt . mkLatent $ year n
-     _ -> Nothing
- }
-
 ruleDOMLatent :: Rule
 ruleDOMLatent = Rule
   { name = "<day-of-month> (ordinal)"
@@ -820,11 +815,14 @@
 ruleTonight :: Rule
 ruleTonight = Rule
   { name = "tonight"
-  , pattern = [regex "toni(ght|gth|te)s?"]
-  , prod = \_ -> do
-      let today = cycleNth TG.Day 0
-      evening <- interval TTime.Open (hour False 18) (hour False 0)
-      Token Time . partOfDay . notLatent <$> intersect today evening
+  , pattern = [regex "(late )?toni(ght|gth|te)s?"]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        let today = cycleNth TG.Day 0
+            h = if Text.toLower match == "late " then 21 else 18
+        evening <- interval TTime.Open (hour False h) (hour False 0)
+        Token Time . partOfDay . notLatent <$> intersect today evening
+      _ -> Nothing
   }
 
 ruleAfterPartofday :: Rule
@@ -881,6 +879,26 @@
   , prod = \_ -> tt $ mkOkForThisNext weekend
   }
 
+ruleSeason :: Rule
+ruleSeason = Rule
+  { name = "last|this|next <season>"
+  , pattern =
+    [ regex "(this|current|next|last|past|previous) seasons?"
+    ]
+  , prod = \case
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        n <- case Text.toLower match of
+               "this" -> Just 0
+               "current" -> Just 0
+               "last" -> Just (-1)
+               "past" -> Just (-1)
+               "previous" -> Just (-1)
+               "next" -> Just 1
+               _ -> Nothing
+        tt $ predNth n False season
+      _ -> Nothing
+  }
+
 ruleSeasons :: [Rule]
 ruleSeasons = mkRuleSeasons
   [ ( "summer", "summer"     , monthDay  6 21, monthDay  9 23 )
@@ -1180,19 +1198,19 @@
   ]
 
 ruleMonths :: [Rule]
-ruleMonths = mkRuleMonths
-  [ ( "January"  , "january|jan\\.?"     )
-  , ( "February" , "february|feb\\.?"    )
-  , ( "March"    , "march|mar\\.?"       )
-  , ( "April"    , "april|apr\\.?"       )
-  , ( "May"      , "may"                 )
-  , ( "June"     , "june|jun\\.?"        )
-  , ( "July"     , "july|jul\\.?"        )
-  , ( "August"   , "august|aug\\.?"      )
-  , ( "September", "september|sept?\\.?" )
-  , ( "October"  , "october|oct\\.?"     )
-  , ( "November" , "november|nov\\.?"    )
-  , ( "December" , "december|dec\\.?"    )
+ruleMonths = mkRuleMonthsWithLatent
+  [ ( "January"  , "january|jan\\.?"    , False )
+  , ( "February" , "february|feb\\.?"   , False )
+  , ( "March"    , "march|mar\\.?"      , False )
+  , ( "April"    , "april|apr\\.?"      , False )
+  , ( "May"      , "may"                , True  )
+  , ( "June"     , "june|jun\\.?"       , False )
+  , ( "July"     , "july|jul\\.?"       , False )
+  , ( "August"   , "august|aug\\.?"     , False )
+  , ( "September", "september|sept?\\.?", False )
+  , ( "October"  , "october|oct\\.?"    , False )
+  , ( "November" , "november|nov\\.?"   , False )
+  , ( "December" , "december|dec\\.?"   , False )
   ]
 
 rulePartOfMonth :: Rule
@@ -1217,42 +1235,485 @@
       _ -> Nothing
   }
 
-ruleUSHolidays :: [Rule]
-ruleUSHolidays = mkRuleHolidays
+ruleEndOrBeginningOfMonth :: Rule
+ruleEndOrBeginningOfMonth = Rule
+  { name = "at the beginning|end of <named-month>"
+  , pattern =
+    [ regex "(at the )?(beginning|end) of"
+    , Predicate isAMonth
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (_:match:_)):Token Time td:_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "beginning" -> Just (1, 10)
+          "end"       -> Just (21, -1)
+          _           -> Nothing
+        start <- intersect td $ dayOfMonth sd
+        end <- if ed /= -1
+          then intersect td $ dayOfMonth ed
+          else Just $ cycleLastOf TG.Day td
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOfMonth :: Rule
+ruleEndOfMonth = Rule
+  { name = "end of month"
+  , pattern = [ regex "(by (the )?|(at )?the )?(EOM|end of (the )?month)" ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_)
+        | (Just start, Just end) <- parsed ->
+          Token Time <$> interval TTime.Open start end
+        where
+          cycleMonth = cycleNth TG.Month
+          parsed = if "by" `Text.isPrefixOf` Text.toLower match
+            then
+              ( Just $ cycleNth TG.Second 0
+              , intersect (dayOfMonth 1) $ cycleMonth 1)
+            else
+              ( intersect (dayOfMonth 21) $ cycleMonth 0
+              , Just $ cycleLastOf TG.Day $ cycleMonth 0)
+      _ -> Nothing
+  }
+
+ruleBeginningOfMonth :: Rule
+ruleBeginningOfMonth = Rule
+  { name = "beginning of month"
+  , pattern = [ regex "((at )?the )?(BOM|beginning of (the )?month)" ]
+  , prod = \_ -> do
+      start <- intersect (dayOfMonth 1) $ cycleNth TG.Month 0
+      end <- intersect (dayOfMonth 10) $ cycleNth TG.Month 0
+      Token Time <$> interval TTime.Open start end
+  }
+
+ruleEndOrBeginningOfYear :: Rule
+ruleEndOrBeginningOfYear = Rule
+  { name = "at the beginning|end of <year>"
+  , pattern =
+    [ regex "(at the )?(beginning|end) of"
+    , Predicate $ isGrainOfTime TG.Year
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (_:match:_)):Token Time td:_) -> do
+        (sd, ed) <- case Text.toLower match of
+          "beginning" -> Just (1, 4)
+          "end"       -> Just (9, -1)
+          _           -> Nothing
+        start <- intersect td $ month sd
+        end <- if ed /= -1
+          then intersect td $ cycleLastOf TG.Month $ month ed
+          else cycleNthAfter False TG.Year 1 <$> intersect td (month 1)
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+ruleEndOfYear :: Rule
+ruleEndOfYear = Rule
+  { name = "end of year"
+  , pattern = [ regex "(by (the )?|(at )?the )?(EOY|end of (the )?year)" ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (match:_)):_) -> do
+        start <- std
+        end <- intersect (month 1) $ cycleYear 1
+        Token Time <$> interval TTime.Open start end
+          where
+            std = if "by" `Text.isPrefixOf` Text.toLower match
+              then Just $ cycleNth TG.Second 0
+              else intersect (month 9) $ cycleYear 0
+            cycleYear = cycleNth TG.Year
+      _ -> Nothing
+  }
+
+ruleBeginningOfYear :: Rule
+ruleBeginningOfYear = Rule
+  { name = "beginning of year"
+  , pattern = [ regex "((at )?the )?(BOY|beginning of (the )?year)" ]
+  , prod = \_ -> do
+      start <- intersect (month 1) $ cycleNth TG.Year 0
+      end <- intersect (month 4) $ cycleNth TG.Year 0
+      Token Time <$> interval TTime.Open start end
+  }
+
+ruleEndOrBeginningOfWeek :: Rule
+ruleEndOrBeginningOfWeek = Rule
+  { name = "at the beginning|end of <week>"
+  , pattern =
+    [ regex "(at the )?(beginning|end) of"
+    , Predicate $ isGrainOfTime TG.Week
+    ]
+  , prod = \tokens -> case tokens of
+      (Token RegexMatch (GroupMatch (_:match1:_)):Token Time td:_) -> do
+        (sd, ed) <- case Text.toLower match1 of
+          "beginning" -> Just (1, 3)
+          "end"       -> Just (5, 7)
+          _           -> Nothing
+        start <- intersect td $ dayOfWeek sd
+        end <- intersect td $ dayOfWeek ed
+        Token Time <$> interval TTime.Open start end
+      _ -> Nothing
+  }
+
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
   -- Fixed dates, year over year
-  [ ( "Christmas"       , "(xmas|christmas)( day)?"         , monthDay 12 25 )
-  , ( "Christmas Eve"   , "(xmas|christmas)( day)?('s)? eve", monthDay 12 24 )
-  , ( "New Year's Eve"  , "new year'?s? eve"                , monthDay 12 31 )
-  , ( "New Year's Day"  , "new year'?s?( day)?"             , monthDay  1  1 )
-  , ( "Valentine's Day" , "valentine'?s?( day)?"            , monthDay  2 14 )
-  , ( "Independence Day", "independence day"                , monthDay  7  4 )
-  , ( "Halloween"       , "hall?owe?en( day)?"              , monthDay 10 31 )
+  [ ( "Africa Day", "africa(n (freedom|liberation))? day", monthDay 5 25 )
+  , ( "Africa Industrialization Day", "africa industrialization day", monthDay 11 20 )
+  , ( "All Saints' Day", "all saints' day", monthDay 11 1 )
+  , ( "All Souls' Day", "all souls' day", monthDay 11 2 )
+  , ( "April Fools", "(april|all) fool'?s('? day)?", monthDay 4 1 )
+  , ( "Arabic Language Day", "arabic language day", monthDay 12 18 )
+  , ( "Assumption of Mary", "assumption of mary", monthDay 8 15 )
+  , ( "Boxing Day", "boxing day", monthDay 12 26 )
+  , ( "Chinese Language Day", "chinese language day", monthDay 4 20 )
+  , ( "Christmas", "(xmas|christmas)( day)?", monthDay 12 25 )
+  , ( "Christmas Eve", "(xmas|christmas)( day)?('s)? eve", monthDay 12 24 )
+  , ( "Day of Remembrance for all Victims of Chemical Warfare", "day of remembrance for all victims of chemical warfare", monthDay 4 29 )
+  , ( "Day of Remembrance of the Victims of the Rwanda Genocide", "day of remembrance of the victims of the rwanda genocide", monthDay 4 7 )
+  , ( "Day of the Seafarer", "day of the seafarer", monthDay 6 25 )
+  , ( "Earth Day", "earth day", monthDay 4 22 )
+  , ( "English Language Day", "english language day", monthDay 4 23 )
+  , ( "Epiphany", "Epiphany", monthDay 1 6 )
+  , ( "Feast of St Francis of Assisi", "feast of st\\.? francis of assisi", monthDay 10 4 )
+  , ( "Feast of the Immaculate Conception", "feast of the immaculate conception", monthDay 12 8 )
+  , ( "Global Day of Parents", "global day of parents", monthDay 6 1 )
+  , ( "Halloween", "hall?owe?en( day)?", monthDay 10 31 )
+  , ( "Human Rights Day", "human rights? day", monthDay 12 10 )
+  , ( "International Albinism Awareness Day", "international albinism awareness day", monthDay 6 13 )
+  , ( "International Anti-Corruption Day", "international anti(\\-|\\s)corruption day", monthDay 12 9 )
+  , ( "International Asteroid Day", "international asteroid day", monthDay 6 30 )
+  , ( "International Celebrate Bisexuality Day", "international celebrate bisexuality day", monthDay 9 23 )
+  , ( "International Chernobyl Disaster Remembrance Day", "international chernobyl disaster remembrance day", monthDay 4 26 )
+  , ( "International Civil Aviation Day", "international civil aviation day", monthDay 12 7 )
+  , ( "International Customs Day", "international customs day", monthDay 1 26 )
+  , ( "International Day Against Drug Abuse and Illicit Trafficking", "international day against drug abuse and illicit trafficking", monthDay 6 26 )
+  , ( "International Day against Nuclear Tests", "international day against nuclear tests", monthDay 8 29 )
+  , ( "International Day for Biological Diversity", "international day for biological diversity|world biodiversity day", monthDay 5 22 )
+  , ( "International Day for Monuments and Sites", "international day for monuments and sites", monthDay 4 18 )
+  , ( "International Day for Preventing the Exploitation of the Environment in War and Armed Conflict", "international day for preventing the exploitation of the environment in war and armed conflict", monthDay 11 6 )
+  , ( "International Day for South-South Cooperation", "international day for south(\\-|\\s)south cooperation", monthDay 9 12 )
+  , ( "International Day for Tolerance", "international day for tolerance", monthDay 11 16 )
+  , ( "International Day for the Abolition of Slavery", "international day for the abolition of slavery", monthDay 12 2 )
+  , ( "International Day for the Elimination of Racial Discrimination", "international day for the elimination of racial discrimination", monthDay 3 21 )
+  , ( "International Day for the Elimination of Sexual Violence in Conflict", "international day for the elimination of sexual violence in conflict", monthDay 6 19 )
+  , ( "International Day for the Elimination of Violence against Women", "international day for the elimination of violence against women", monthDay 11 25 )
+  , ( "International Day for the Eradication of Poverty", "international day for the eradication of poverty", monthDay 10 17 )
+  , ( "International Day for the Preservation of the Ozone Layer", "international day for the preservation of the ozone Layer", monthDay 9 16 )
+  , ( "International Day for the Remembrance of the Slave Trade and its Abolition", "international day for the remembrance of the slave trade and its abolition", monthDay 8 23 )
+  , ( "International Day for the Right to the Truth concerning Gross Human Rights Violations and for the Dignity of Victims", "international day for the right to the truth concerning gross human rights violations and for the dignity of victims", monthDay 3 24 )
+  , ( "International Day for the Total Elimination of Nuclear Weapons", "international day for the total elimination of nuclear weapons", monthDay 9 26 )
+  , ( "International Day in Support of Victims of Torture", "international day in support of victims of torture", monthDay 6 26 )
+  , ( "International Day of Charity", "international day of charity", monthDay 9 5 )
+  , ( "International Day of Commemoration in Memory of the Victims of the Holocaust", "international day of commemoration in memory of the victims of the holocaust", monthDay 1 27 )
+  , ( "International Day of Democracy", "international day of democracy", monthDay 9 15 )
+  , ( "International Day of Disabled Persons", "international day of disabled persons", monthDay 12 3 )
+  , ( "International Day of Families", "international day of families", monthDay 5 15 )
+  , ( "International Day of Family Remittances", "international day of family remittances", monthDay 6 16 )
+  , ( "International Day of Forests", "international day of forests", monthDay 3 21 )
+  , ( "International Day of Friendship", "international day of friendship", monthDay 7 30 )
+  , ( "International Day of Happiness", "international day of happiness", monthDay 3 20 )
+  , ( "International Day of Human Space Flight", "international day of human space flight", monthDay 4 12 )
+  , ( "International Day of Innocent Children Victims of Aggression", "international day of innocent children victims of aggression", monthDay 6 4 )
+  , ( "International Day of Non-Violence", "international day of non(\\-|\\s)violence", monthDay 10 2 )
+  , ( "International Day of Nowruz", "international day of nowruz", monthDay 3 21 )
+  , ( "International Day of Older Persons", "international day of older persons", monthDay 10 1 )
+  , ( "International Day of Peace", "international day of peace", monthDay 9 21 )
+  , ( "International Day of Persons with Disabilities", "international day of persons with disabilities", monthDay 12 3 )
+  , ( "International Day of Remembrance of Slavery Victims and the Transatlantic Slave Trade", "international day of remembrance of slavery victims and the transatlantic slave trade", monthDay 3 25 )
+  , ( "International Day of Rural Women", "international day of rural women", monthDay 10 15 )
+  , ( "International Day of Solidarity with Detained and Missing Staff Members", "international day of solidarity with detained and missing staff members", monthDay 3 25 )
+  , ( "International Day of Solidarity with the Palestinian People", "international day of solidarity with the palestinian people", monthDay 11 29 )
+  , ( "International Day of Sport for Development and Peace", "international day of sport for development and peace", monthDay 4 6 )
+  , ( "International Day of United Nations Peacekeepers", "international day of united nations peacekeepers", monthDay 5 29 )
+  , ( "International Day of Women and Girls in Science", "international day of women and girls in science", monthDay 2 11 )
+  , ( "International Day of Yoga", "international day of yoga", monthDay 6 21 )
+  , ( "International Day of Zero Tolerance for Female Genital Mutilation", "international day of zero tolerance for female genital mutilation", monthDay 2 6 )
+  , ( "International Day of the Girl Child", "international day of the girl child", monthDay 10 11 )
+  , ( "International Day of the Victims of Enforced Disappearances", "international day of the victims of enforced disappearances", monthDay 8 30 )
+  , ( "International Day of the World's Indigenous People", "international day of the world'?s indigenous people", monthDay 8 9 )
+  , ( "International Day to End Impunity for Crimes against Journalists", "international day to end impunity for crimes against journalists", monthDay 11 2 )
+  , ( "International Day to End Obstetric Fistula", "international day to end obstetric fistula", monthDay 5 23 )
+  , ( "International Day for Disaster Reduction", "iddr|international day for (natural )?disaster reduction", monthDay 10 13 )
+  , ( "International Human Solidarity Day", "international human solidarity day", monthDay 12 20 )
+  , ( "International Jazz Day", "international jazz day", monthDay 4 30 )
+  , ( "International Literacy Day", "international literacy day", monthDay 9 8 )
+  , ( "International Men's Day", "international men'?s day", monthDay 11 19 )
+  , ( "International Migrants Day", "international migrants day", monthDay 12 18 )
+  , ( "International Mother Language Day", "international mother language day", monthDay 2 21 )
+  , ( "International Mountain Day", "international mountain day", monthDay 12 11 )
+  , ( "International Nurses Day", "international nurses day", monthDay 5 12 )
+  , ( "International Overdose Awareness Day", "international overdose awareness day", monthDay 8 31 )
+  , ( "International Volunteer Day for Economic and Social Development", "international volunteer day for economic and social development", monthDay 12 5 )
+  , ( "International Widows' Day", "international widows'? day", monthDay 6 23 )
+  , ( "International Women's Day", "international women'?s day", monthDay 3 8 )
+  , ( "International Youth Day", "international youth day", monthDay 8 12 )
+  , ( "May Day", "may day", monthDay 5 1 )
+  , ( "Nelson Mandela Day", "nelson mandela day", monthDay 7 18 )
+  , ( "New Year's Day", "new year'?s?( day)?", monthDay  1  1 )
+  , ( "New Year's Eve", "new year'?s? eve", monthDay 12 31 )
+  , ( "Orthodox Christmas Day", "orthodox christmas day", monthDay 1 7 )
+  , ( "Orthodox New Year", "orthodox new year", monthDay 1 14 )
+  , ( "Public Service Day", "public service day", monthDay 6 23 )
+  , ( "St. George's Day", "(saint|st\\.?) george'?s day|feast of saint george", monthDay 4 23 )
+  , ( "St Patrick's Day", "st\\.? patrick'?s day", monthDay 3 17 )
+  , ( "St. Stephen's Day", "st\\.? stephen'?s day", monthDay 12 26 )
+  , ( "Time of Remembrance and Reconciliation for Those Who Lost Their Lives during the Second World War", "time of remembrance and reconciliation for those who lost their lives during the second world war", monthDay 5 8 )
+  , ( "United Nations Day", "united nations day", monthDay 10 24 )
+  , ( "United Nations' Mine Awareness Day", "united nations'? mine awareness day", monthDay 4 4 )
+  , ( "United Nations' World Health Day", "united nations'? world health day", monthDay 4 7 )
+  , ( "Universal Children's Day", "universal children'?s day", monthDay 11 20 )
+  , ( "Valentine's Day", "valentine'?s?( day)?", monthDay 2 14 )
+  , ( "World AIDS Day", "world aids day", monthDay 12 1 )
+  , ( "World Autism Awareness Day", "world autism awareness day", monthDay 4 2 )
+  , ( "World Autoimmune Arthritis Day", "world autoimmune arthritis day", monthDay 5 20 )
+  , ( "World Blood Donor Day", "world blood donor day", monthDay 6 14 )
+  , ( "World Book and Copyright Day", "world book and copyright day", monthDay 4 23 )
+  , ( "World Braille Day", "world braille day", monthDay 1 4 )
+  , ( "World Cancer Day", "world cancer day", monthDay 2 4 )
+  , ( "World Cities Day", "world cities day", monthDay 10 31 )
+  , ( "World CP Day", "world (cerebral palsy| cp) day", monthDay 10 6 )
+  , ( "World Day Against Child Labour", "world day against child labour", monthDay 6 12 )
+  , ( "World Day against Trafficking in Persons", "world day against trafficking in persons", monthDay 7 30 )
+  , ( "World Day for Audiovisual Heritage", "world day for audiovisual heritage", monthDay 10 27 )
+  , ( "World Day for Cultural Diversity for Dialogue and Development", "world day for cultural diversity for dialogue and development", monthDay 5 21 )
+  , ( "World Day for Safety and Health at Work", "world day for safety and health at work", monthDay 4 28 )
+  , ( "World Day for the Abolition of Slavery", "world day for the abolition of slavery", monthDay 12 2 )
+  , ( "World Day of Social Justice", "world day of social justice", monthDay 2 20 )
+  , ( "World Day of the Sick", "world day of the sick", monthDay 2 11 )
+  , ( "World Day to Combat Desertification and Drought", "world day to combat desertification and drought", monthDay 6 17 )
+  , ( "World Development Information Day", "world development information day", monthDay 10 24 )
+  , ( "World Diabetes Day", "world diabetes day", monthDay 11 14 )
+  , ( "World Down Syndrome Day", "world down syndrome day", monthDay 3 21 )
+  , ( "World Elder Abuse Awareness Day", "world elder abuse awareness day", monthDay 6 15 )
+  , ( "World Environment Day", "world environment day", monthDay 6 5 )
+  , ( "World Food Day", "world food day", monthDay 10 16 )
+  , ( "World Genocide Commemoration Day", "world genocide commemoration day", monthDay 12 9 )
+  , ( "World Heart Day", "world heart day", monthDay 9 29 )
+  , ( "World Hepatitis Day", "world hepatitis day", monthDay 7 28 )
+  , ( "World Humanitarian Day", "world humanitarian day", monthDay 8 19 )
+  , ( "World Information Society Day", "world information society day", monthDay 5 17 )
+  , ( "World Intellectual Property Day", "world intellectual property day", monthDay 4 26 )
+  , ( "World Malaria Day", "world malaria day", monthDay 4 25 )
+  , ( "World Mental Health Day", "world mental health day", monthDay 10 10 )
+  , ( "World Meteorological Day", "world meteorological day", monthDay 3 23 )
+  , ( "World No Tobacco Day", "world no tobacco day", monthDay 5 31 )
+  , ( "World Oceans Day", "world oceans day", monthDay 6 8 )
+  , ( "World Ovarian Cancer Day", "world ovarian cancer day", monthDay 5 8 )
+  , ( "World Pneumonia Day", "world pneumonia day", monthDay 11 12 )
+  , ( "World Poetry Day", "world poetry day", monthDay 3 21 )
+  , ( "World Population Day", "world population day", monthDay 7 11 )
+  , ( "World Post Day", "world post day", monthDay 10 9 )
+  , ( "World Prematurity Day", "world prematurity day", monthDay 11 17 )
+  , ( "World Press Freedom Day", "world press freedom day", monthDay 5 3 )
+  , ( "World Rabies Day", "world rabies day", monthDay 9 28 )
+  , ( "World Radio Day", "world radio day", monthDay 2 13 )
+  , ( "World Refugee Day", "world refugee day", monthDay 6 20 )
+  , ( "World Science Day for Peace and Development", "world science day for peace and development", monthDay 11 10 )
+  , ( "World Sexual Health Day", "world sexual health day", monthDay 9 4 )
+  , ( "World Soil Day", "world soil day", monthDay 12 5 )
+  , ( "World Stroke Day", "world stroke day", monthDay 10 29 )
+  , ( "World Suicide Prevention Day", "world suicide prevention day", monthDay 9 10 )
+  , ( "World Teachers' Day", "world teachers'? day", monthDay 10 5 )
+  , ( "World Television Day", "world television day", monthDay 11 21 )
+  , ( "World Toilet Day", "world toilet day", monthDay 11 19 )
+  , ( "World Tourism Day", "world tourism day", monthDay 9 27 )
+  , ( "World Tuberculosis Day", "world tuberculosis day", monthDay 3 24 )
+  , ( "World Tuna Day", "world tuna day", monthDay 5 2 )
+  , ( "World Vegan Day", "world vegan day", monthDay 11 1 )
+  , ( "World Vegetarian Day", "world vegetarian day", monthDay 10 1 )
+  , ( "World Water Day", "world water day", monthDay 3 22 )
+  , ( "World Wetlands Day", "world wetlands day", monthDay 2 2 )
+  , ( "World Wildlife Day", "world wildlife day", monthDay 3 3 )
+  , ( "World Youth Skills Day", "world youth skills day", monthDay 7 15 )
+  , ( "Zero Discrimination Day", "zero discrimination day", monthDay 3 1 )
 
   -- Fixed day/week/month, year over year
+  , ( "Commonwealth Day", "commonwealth day", nthDOWOfMonth 2 1 3 )
+  , ( "Day of Remembrance for Road Traffic Victims"
+    , "(world )?day of remembrance for road traffic victims"
+    , nthDOWOfMonth 3 7 11 )
+  , ( "International Day of Cooperatives"
+    , "international day of co\\-?operatives", nthDOWOfMonth 1 6 7 )
   , ( "Martin Luther King's Day"
-    , "(MLK|Martin Luther King,?)( Jr.?| Junior)? day"
+    , "(MLK|Martin Luther King,?)( Jr\\.?| Junior)? day|(civil|idaho human) rights day"
     , nthDOWOfMonth 3 1 1
     )
-  , ( "Father's Day"            , "father'?s?'? day", nthDOWOfMonth 3 7 6 )
-  , ( "Mother's Day"            , "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
-  , ( "Labor Day"               , "labor day"       , nthDOWOfMonth 1 1 9 )
 
   -- The day after Thanksgiving (not always the fourth Friday of November)
   , ( "Black Friday", "black frid?day"
     , cycleNthAfter False TG.Day 1 $ nthDOWOfMonth 4 4 11
     )
-  -- Last Monday of May
-  , ( "Memorial Day", "memorial day", predLastOf (dayOfWeek 1) (month 5) )
-  -- Long weekend before the last Monday of May
-  , ( "Memorial Day weekend", "memorial day week(\\s|-)?ends?"
-    , longWEBefore $ predLastOf (dayOfWeek 1) (month 5)
-    )
-  -- Long weekend before the first Monday of September
-  , ( "Labor Day weekend", "labor day week(\\s|-)?ends?"
-    , longWEBefore $ nthDOWOfMonth 1 1 9
+  , ( "World Habitat Day", "world habitat day", nthDOWOfMonth 1 1 10 )
+  , ( "World Kidney Day", "world kidney day", nthDOWOfMonth 2 4 3 )
+  , ( "World Leprosy Day", "world leprosy day"
+    , predLastOf (dayOfWeek 7) (month 1) )
+  , ( "World Maritime Day", "world maritime day"
+    , predLastOf (dayOfWeek 4) (month 9) )
+  , ( "World Migratory Bird Day", "world migratory bird day"
+    , nthDOWOfMonth 2 6 5 )
+  , ( "World Philosophy Day", "world philosophy day", nthDOWOfMonth 3 4 11 )
+  , ( "World Religion Day", "world religion day", nthDOWOfMonth 3 7 1 )
+  , ( "World Sight Day", "world sight day", nthDOWOfMonth 2 4 10 )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Ascension Day", "ascension\\s+(thurs)?day"
+    , cycleNthAfter False TG.Day 39 easterSunday )
+  , ( "Ash Wednesday", "ash\\s+wednesday|carnival"
+    , cycleNthAfter False TG.Day (-46) easterSunday )
+  , ( "Ashura", "(day of )?ashura"
+    , cycleNthAfter False TG.Day 9 muharram )
+  , ( "Bhai Dooj", "bhai(ya)?\\s+d(u|oo)j|bhau\\-beej|bhai\\s+(tika|phonta)"
+    , cycleNthAfter False TG.Day 4 dhanteras )
+  -- 6th day after Diwali
+  , ( "Chhath", "chhathi?|chhath (parv|puja)|dala (chhath|puja)|surya shashthi"
+    , cycleNthAfter False TG.Day 8 dhanteras )
+  , ( "Boghi", "boghi|bogi\\s+pandigai"
+    , cycleNthAfter False TG.Day (-1) thaiPongal )
+  , ( "Chinese New Year", "chinese\\s+(lunar\\s+)?new\\s+year('s\\s+day)?"
+    , chineseNewYear )
+  , ( "Clean Monday"
+    , "(orthodox\\s+)?(ash|clean|green|pure|shrove)\\s+monday|monday of lent"
+    , cycleNthAfter False TG.Day (-48) orthodoxEaster )
+  , ( "Corpus Christi", "(the feast of )?corpus\\s+christi"
+    , cycleNthAfter False TG.Day 60 easterSunday )
+  , ( "Dhanteras", "dhanatrayodashi|dhanteras|dhanvantari\\s+trayodashi"
+    , dhanteras )
+  , ( "Diwali", "deepavali|diwali|lakshmi\\s+puja"
+    , cycleNthAfter False TG.Day 2 dhanteras )
+  , ( "Durga Ashtami", "(durga|maha)(\\s+a)?shtami"
+    , cycleNthAfter False TG.Day 7 navaratri )
+  , ( "Easter Monday", "easter\\s+mon(day)?"
+    , cycleNthAfter False TG.Day 1 easterSunday )
+  , ( "Easter Sunday", "easter(\\s+sun(day)?)?", easterSunday )
+  , ( "Eid al-Adha", "bakr[\\-\\s]e?id|e?id [au]l\\-adha|sacrifice feast"
+    , eidalAdha )
+  , ( "Eid al-Fitr", "eid al\\-fitr", eidalFitr )
+  , ( "Govardhan Puja", "govardhan\\s+puja|annak(u|oo)t"
+    , cycleNthAfter False TG.Day 3 dhanteras )
+  , ( "Good Friday", "(good|great|holy)\\s+fri(day)?"
+    , cycleNthAfter False TG.Day (-2) easterSunday )
+  , ( "Holi", "(rangwali )?holi|dhuleti|dhulandi|phagwah"
+    , cycleNthAfter False TG.Day 39 vasantPanchami )
+  , ( "Holika Dahan", "holika dahan|kamudu pyre|chhoti holi"
+    , cycleNthAfter False TG.Day 38 vasantPanchami )
+  , ( "Holy Saturday"
+    , "(black|holy (and great )?|joyous)sat(urday)?|the great sabbath|easter eve"
+    , cycleNthAfter False TG.Day (-1) easterSunday )
+  , ( "Islamic New Year", "(arabic|hijri|islamic) new year|amun jadid|muharram"
+    , muharram )
+  , ( "Isra and Mi'raj"
+    , "isra and mi'raj|(the )?prophet'?s'? ascension|(the )?ascension to heaven|the night journey"
+    , cycleNthAfter False TG.Day 26 rajab
     )
+  , ( "Jumu'atul-Wida", "jumu'atul\\-widaa?'?|jamat[\\-\\s]ul[\\-\\s]vida"
+    , predNthAfter (-1) (dayOfWeek 5) eidalFitr )
+  , ( "Kaanum Pongal", "(kaanum|kanni)\\s+pongal"
+    , cycleNthAfter False TG.Day 2 thaiPongal )
+  , ( "Lag BaOmer", "lag b[a']omer", lagBaOmer )
+  , ( "Laylat al-Qadr"
+    , "laylat al[\\-\\s][qk]adr|night of (destiny|measures|power|value)"
+    , cycleNthAfter False TG.Day 26 ramadan )
+  , ( "Lazarus Saturday", "lazarus\\s+saturday"
+    , cycleNthAfter False TG.Day (-8) orthodoxEaster )
+  , ( "Maha Navami", "maha\\s+navami", cycleNthAfter False TG.Day 8 navaratri )
+  , ( "Maha Saptami", "maha\\s+saptami", cycleNthAfter False TG.Day 6 navaratri )
+  , ( "Mattu Pongal", "maa?ttu\\s+pongal"
+    , cycleNthAfter False TG.Day 1 thaiPongal )
+  , ( "Maundy Thursday"
+    , "(covenant|(great and )?holy|maundy|sheer)\\s+thu(rsday)?|thu(rsday)? of mysteries"
+    , cycleNthAfter False TG.Day (-3) easterSunday )
+  , ( "Mawlid"
+    , "mawlid(\\s+al\\-nab(awi|i\\s+al\\-sharif))?|mevli[dt]|mulud|birth(day)? of (the )?prophet( muhammad)?|(the )?prophet's birthday"
+    , mawlid )
+  , ( "Naraka Chaturdashi"
+    , "naraka? (nivaran )?chaturdashi|(kali|roop) chaudas|choti diwali"
+    , cycleNthAfter False TG.Day 1 dhanteras )
+  , ( "Orthodox Easter Monday", "orthodox\\s+easter\\s+mon(day)?"
+    , cycleNthAfter False TG.Day 1 orthodoxEaster )
+  , ( "Orthodox Easter Sunday", "orthodox\\s+easter(\\s+sun(day)?)?|pascha?"
+    , orthodoxEaster )
+  , ( "Orthodox Holy Saturday", "orthodox\\s+holy\\s+sat(urday)?|the great sabbath"
+    , cycleNthAfter False TG.Day (-1) orthodoxEaster )
+  , ( "Orthodox Great Friday", "orthodox\\s+great(\\s+and\\s+holy)?\\s+friday"
+    , cycleNthAfter False TG.Day (-2) orthodoxEaster )
+  , ( "Orthodox Palm Sunday", "orthodox\\s+(branch|palm|yew\\s+sunday)"
+    , cycleNthAfter False TG.Day (-7) orthodoxEaster )
+  , ( "Palm Sunday", "branch|palm|yew\\s+sunday"
+    , cycleNthAfter False TG.Day (-7) easterSunday )
+  , ( "Pentecost", "pentecost|white sunday|whitsunday"
+    , cycleNthAfter False TG.Day 49 easterSunday )
+  , ( "Raksha Bandhan", "raksha(\\s+)?bandhan|rakhi", rakshaBandhan )
+  , ( "Shemini Atzeret", "shemini\\s+atzeret"
+    , cycleNthAfter False TG.Day 21 roshHashana )
+  , ( "Shrove Tuesday", "pancake (tues)?day|shrove tuesday"
+    , cycleNthAfter False TG.Day (-47) easterSunday )
+  , ( "Simchat Torah", "simc?hat\\s+torah"
+    , cycleNthAfter False TG.Day 22 roshHashana )
+  , ( "Thai Pongal"
+    , "(thai )?pongal|pongal pandigai|(makara? |magha )?sankranth?i|maghi"
+    , thaiPongal )
+  , ( "Thiru Onam", "(thiru(v|\\s+))?onam", thiruOnam )
+  , ( "Tisha B'Av", "tisha b'av", tishaBAv )
+  , ( "Trinity Sunday", "trinity\\s+sunday"
+    , cycleNthAfter False TG.Day 56 easterSunday )
+  , ( "Vasant Panchami", "[bv]asant\\s+panchami", vasantPanchami )
+  , ( "Vijayadashami", "dasara|duss(eh|he)ra|vijayadashami"
+    , cycleNthAfter False TG.Day 9 navaratri )
+  -- 15th day of Shevat
+  , ( "Tu BiShvat", "tu b[i']shvat", tuBishvat )
+  , ( "Yom Ha'atzmaut", "yom ha'?atzmaut", yomHaatzmaut )
+  , ( "Yom HaShoah"
+    , "yom hashoah|yom hazikaron lashoah ve-lag'vurah|holocaust (remembrance )?day"
+    , cycleNthAfter False TG.Day 12 passover )
+  , ( "Yom Kippur", "yom\\s+kippur", cycleNthAfter False TG.Day 9 roshHashana )
+  , ( "Whit Monday", "(pentecost|whit)\\s+monday|monday of the holy spirit"
+    , cycleNthAfter False TG.Day 50 easterSunday )
+
+  -- Other
+  , ( "Boss's Day", "boss'?s?( day)?"
+    , predNthClosest 0 weekday (monthDay 10 16) )
   ]
 
+ruleComputedHolidays' :: [Rule]
+ruleComputedHolidays' = mkRuleHolidays'
+  [ ( "Great Lent", "great\\s+(fast|lent)"
+    , let start = cycleNthAfter False TG.Day (-48) orthodoxEaster
+          end = cycleNthAfter False TG.Day (-9) orthodoxEaster
+        in interval TTime.Open start end )
+  , ( "Hanukkah", "c?hanukk?ah"
+    , let start = chanukah
+          end = cycleNthAfter False TG.Day 7 chanukah
+        in interval TTime.Open start end )
+  , ( "Lent", "lent"
+    , let start = cycleNthAfter False TG.Day (-46) easterSunday
+          end = cycleNthAfter False TG.Day (-1) easterSunday
+        in interval TTime.Open start end )
+  , ( "Navaratri", "durga\\s+puja|durgotsava|nava?rath?ri"
+    , let start = navaratri
+          end = cycleNthAfter False TG.Day 9 navaratri
+        in interval TTime.Open start end )
+  , ( "Passover", "passover|pesa[ck]?h"
+    , let start = passover
+          end = cycleNthAfter False TG.Day 8 passover
+        in interval TTime.Open start end )
+  , ( "Ramadan", "rama[dt]h?an|ramzaa?n"
+    , let start = ramadan
+          end = cycleNthAfter False TG.Day (-1) eidalFitr
+        in interval TTime.Open start end )
+  , ( "Rosh Hashanah", "rosh hashanah|yom teruah"
+    , let start = roshHashana
+          end = cycleNthAfter False TG.Day 2 roshHashana
+        in interval TTime.Open start end )
+  , ( "Shavuot", "feast of weeks|shavu'?oth?|shovuos"
+    , let start = cycleNthAfter False TG.Day 50 passover
+          end = cycleNthAfter False TG.Day 52 passover
+        in interval TTime.Open start end )
+  , ( "Sukkot", "feast of (booths|tabernacles|the ingathering)|su[ck]{2}o[st]"
+    , let start = cycleNthAfter False TG.Day 14 roshHashana
+          end = cycleNthAfter False TG.Day 22 roshHashana
+        in interval TTime.Open start end )
+  ]
 
 ruleCycleThisLastNext :: Rule
 ruleCycleThisLastNext = Rule
@@ -1276,6 +1737,19 @@
       _ -> Nothing
   }
 
+ruleDOMOfTimeMonth :: Rule
+ruleDOMOfTimeMonth = Rule
+  { name = "<day-of-month> (ordinal or number) of <month>"
+  , pattern =
+    [ Predicate isDOMValue
+    , regex "of( the)?"
+    , Predicate $ isGrainOfTime TG.Month
+    ]
+  , prod = \tokens -> case tokens of
+      (token:_:Token Time td:_) -> Token Time <$> intersectDOM td token
+      _ -> Nothing
+  }
+
 ruleCycleTheAfterBeforeTime :: Rule
 ruleCycleTheAfterBeforeTime = Rule
   { name = "the <cycle> after|before <time>"
@@ -1494,6 +1968,38 @@
       _ -> Nothing
   }
 
+ruleDayDurationHenceAgo :: Rule
+ruleDayDurationHenceAgo = Rule
+  { name = "<day> <duration> hence|ago"
+  , pattern =
+    [ Predicate $ or . sequence [isGrainOfTime TG.Day, isGrainOfTime TG.Month]
+    , dimension Duration
+    , regex "(from now|hence|ago)"
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:
+       Token Duration dd:
+       Token RegexMatch (GroupMatch (match:_)):
+       _) -> case Text.toLower match of
+         "ago" -> Token Time <$> intersect td (durationIntervalAgo dd)
+         _     -> Token Time <$> intersect td (inDurationInterval dd)
+      _ -> Nothing
+  }
+
+ruleDayInDuration :: Rule
+ruleDayInDuration = Rule
+  { name = "<day> in <duration>"
+  , pattern =
+    [ Predicate $ or . sequence [isGrainOfTime TG.Day, isGrainOfTime TG.Month]
+    , regex "in"
+    , dimension Duration
+    ]
+  , prod = \tokens -> case tokens of
+      (Token Time td:_:Token Duration dd:_) ->
+        Token Time <$> intersect td (inDurationInterval dd)
+      _ -> Nothing
+  }
+
 ruleInNumeral :: Rule
 ruleInNumeral = Rule
   { name = "in <number> (implicit minutes)"
@@ -1560,7 +2066,7 @@
   , ruleIntersectOf
   , ruleAbsorbOnTime
   , ruleAbsorbOnADOW
-  , ruleAbsorbInMonth
+  , ruleAbsorbInMonthYear
   , ruleAbsorbCommaTOD
   , ruleNextDOW
   , ruleNextTime
@@ -1569,14 +2075,13 @@
   , ruleTimeBeforeLastAfterNext
   , ruleLastDOWOfTime
   , ruleLastCycleOfTime
+  , ruleLastNight
   , ruleLastWeekendOfMonth
   , ruleNthTimeOfTime
   , ruleTheNthTimeOfTime
   , ruleNthTimeAfterTime
   , ruleTheNthTimeAfterTime
-  , ruleYear
-  , ruleYearPastLatent
-  , ruleYearFutureLatent
+  , ruleYearLatent
   , ruleTheDOMNumeral
   , ruleTheDOMOrdinal
   , ruleDOMLatent
@@ -1637,6 +2142,7 @@
   , ruleIntervalAfterFromSinceTOD
   , ruleCycleTheAfterBeforeTime
   , ruleCycleThisLastNext
+  , ruleDOMOfTimeMonth
   , ruleCycleAfterBeforeTime
   , ruleCycleOrdinalOfTime
   , ruleCycleTheOrdinalOfTime
@@ -1649,15 +2155,27 @@
   , ruleDurationInWithinAfter
   , ruleDurationLastNext
   , ruleDurationHenceAgo
+  , ruleDayDurationHenceAgo
+  , ruleDayInDuration
   , ruleDurationAfterBeforeTime
   , ruleIntervalForDurationFrom
   , ruleInNumeral
   , ruleTimezone
   , rulePartOfMonth
+  , ruleEndOrBeginningOfMonth
+  , ruleEndOrBeginningOfYear
+  , ruleEndOrBeginningOfWeek
   , ruleNow
+  , ruleSeason
+  , ruleEndOfMonth
+  , ruleBeginningOfMonth
+  , ruleEndOfYear
+  , ruleBeginningOfYear
   ]
   ++ ruleInstants
   ++ ruleDaysOfWeek
   ++ ruleMonths
   ++ ruleSeasons
-  ++ ruleUSHolidays
+  ++ ruleComputedHolidays
+  ++ ruleComputedHolidays'
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/TT/Corpus.hs b/Duckling/Time/EN/TT/Corpus.hs
--- a/Duckling/Time/EN/TT/Corpus.hs
+++ b/Duckling/Time/EN/TT/Corpus.hs
@@ -33,6 +33,7 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "25/4 at 4:00pm"
@@ -41,25 +42,57 @@
              [ "10/10"
              , "10/10/2013"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 5, 30, 0, 0, 0) Day "Indian Arrival Day")
+             [ "Indian arrival day"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 6, 19, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 19, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
+             ]
+  , examples (datetimeHoliday (2017, 9, 30, 0, 0, 0) Day "Hosay")
+             [ "hosay 2017"
              ]
   ]
diff --git a/Duckling/Time/EN/TT/Rules.hs b/Duckling/Time/EN/TT/Rules.hs
--- a/Duckling/Time/EN/TT/Rules.hs
+++ b/Duckling/Time/EN/TT/Rules.hs
@@ -20,9 +20,11 @@
 import Duckling.Dimensions.Types
 import Duckling.Numeral.Helpers (parseInt)
 import Duckling.Regex.Types
+import Duckling.Time.Computed
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
 
 ruleDDMM :: Rule
 ruleDDMM = Rule
@@ -42,7 +44,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +71,29 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Indian Arrival Day", "indian arrival day", monthDay 5 30 )
+  , ( "Labour Day", "labour day", monthDay 6 19 )
+  , ( "Spiritual Baptist Liberation Day", "spiritual baptist liberation day", monthDay 3 30 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
+ruleComputedHolidays :: [Rule]
+ruleComputedHolidays = mkRuleHolidays
+  [ ( "Hosay", "hosay", cycleNthAfter False TG.Day 9 muharram )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleDDMM
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ ruleComputedHolidays
+  ++ rulePeriodicHolidays
diff --git a/Duckling/Time/EN/US/Corpus.hs b/Duckling/Time/EN/US/Corpus.hs
--- a/Duckling/Time/EN/US/Corpus.hs
+++ b/Duckling/Time/EN/US/Corpus.hs
@@ -33,29 +33,112 @@
              , "10/31/74"
              , "10-31-74"
              , "10.31.1974"
+             , "10 31 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "4/25 at 4:00pm"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2012, 11, 26, 0, 0, 0) Day "Cyber Monday")
+             [ "last cyber monday"
+             , "cyber monday 2012"
+             ]
+  , examples (datetimeHoliday (2017, 11, 27, 0, 0, 0) Day "Cyber Monday")
+             [ "cyber monday 2017"
+             ]
+  , examples (datetimeHoliday (2013, 5, 27, 0, 0, 0) Day "Memorial Day")
+             [ "memorial day"
+             , "Next Memorial Day"
+             , "decoration day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 28, 0, 0, 0) Day "Memorial Day")
+             [ "last memorial day"
+             , "memorial day of last year"
+             ]
+  , examples (datetimeIntervalHoliday ((2013, 5, 24, 18, 0, 0), (2013, 5, 28, 0, 0, 0)) Hour "Memorial Day weekend")
+             [ "memorial day week-end"
+             ]
+  , examples (datetimeHoliday (2013, 7, 4, 0, 0, 0) Day "Independence Day")
+             [ "independence day"
+             ]
+  , examples (datetimeHoliday (2013, 11, 11, 0, 0, 0) Day "Veterans Day")
+             [ "veterans day"
+             ]
+  , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Loyalty Day")
+             [ "law day"
+             , "Lei Day"
+             , "loyalty day"
+             ]
+  , examples (datetimeHoliday (2013, 2, 18, 0, 0, 0) Day "President's Day")
+             [ "George Washington Day"
+             , "washington's birthday"
+             , "presidents' day"
+             , "president day 2013"
+             , "Daisy Gatson Bates Day"
+             ]
+  , examples (datetimeHoliday (2013, 2, 12, 0, 0, 0) Day "Lincoln's Birthday")
+             [ "Lincolns birthday"
+             , "Abraham Lincoln's birthday"
+             , "Lincoln birthday"
+             , "Lincolns' birthday"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2019, 9, 8, 0, 0, 0) Day "National Grandparents Day")
+             [ "national grandparents day 2019"
+             ]
+  , examples (datetimeHoliday (2018, 5, 11, 0, 0, 0) Day "Military Spouse Day")
+             [ "Military Spouse day 2018"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 9, 2, 0, 0, 0) Day "Labor Day")
+             [ "labor day"
+             ]
+  , examples (datetimeHoliday (2012, 9, 3, 0, 0, 0) Day "Labor Day")
+             [ "labor day of last year"
+             , "Labor Day 2012"
+             ]
+  , examples (datetimeIntervalHoliday ((2013, 8, 30, 18, 0, 0), (2013, 9, 3, 0, 0, 0)) Hour "Labor Day weekend")
+             [ "labor day weekend"
+             ]
+  , examples (datetimeHoliday (2013, 2, 2, 0, 0, 0) Day "Groundhog Day")
+             [ "Groundhog day"
+             , "groundhogs day"
              ]
   ]
diff --git a/Duckling/Time/EN/US/Rules.hs b/Duckling/Time/EN/US/Rules.hs
--- a/Duckling/Time/EN/US/Rules.hs
+++ b/Duckling/Time/EN/US/Rules.hs
@@ -12,10 +12,7 @@
 
 module Duckling.Time.EN.US.Rules
   ( rules
-  , ruleMMDD
-  , ruleMMDDYYYY
-  , ruleMMDDYYYYDot
-  , ruleThanksgiving
+  , rulesBackwardCompatible
   ) where
 
 import Data.Maybe
@@ -27,6 +24,8 @@
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
+import qualified Duckling.Time.Types as TTime
+import qualified Duckling.TimeGrain.Types as TG
 
 ruleMMDD :: Rule
 ruleMMDD = Rule
@@ -46,7 +45,7 @@
 ruleMMDDYYYY = Rule
   { name = "mm/dd/yyyy"
   , pattern =
-    [ regex "(1[0-2]|0?[1-9])[/-](3[01]|[12]\\d|0?[1-9])[/-](\\d{2,4})"
+    [ regex "(1[0-2]|0?[1-9])[-/\\s](3[01]|[12]\\d|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (mm:dd:yy:_)):_) -> do
@@ -73,20 +72,181 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+ruleBackwardCompatibleHolidays :: [Rule]
+ruleBackwardCompatibleHolidays = mkRuleHolidays
+  [ ("Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11)
+  , ("Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6)
+  ]
 
-rules :: [Rule]
-rules =
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "African Liberation Day", "african liberation day", monthDay 5 25 )
+  , ( "Air Force Birthday", "air force birthday", monthDay 9 18 )
+  , ( "Alaska Day", "alaska day", monthDay 10 18 )
+  , ( "American Eagle Day", "american eagle day", monthDay 6 20 )
+  , ( "Army Birthday", "army birthday", monthDay 6 14 )
+  , ( "Bennington Battle Day", "bennington battle day", monthDay 8 16 )
+  , ( "Bunker Hill Day", "bunker hill day", monthDay 6 17 )
+  , ( "California Admission Day", "california admission day", monthDay 9 9 )
+  , ( "Cinco de Mayo", "cinco de mayo", monthDay 5 5 )
+  , ( "Citizenship Day", "citizenship day|i am an american day", monthDay 9 17 )
+  , ( "Coast Guard Birthday", "coast guard (birth)?day", monthDay 8 4 )
+  , ( "Colorado Day", "colorado day", monthDay 8 1 )
+  , ( "Constitution Day and Citizenship Day", "constitution day and citizenship day", monthDay 9 17 )
+  , ( "César Chávez Day", "c[ée]sar ch[áa]vez day", monthDay 3 31 )
+  , ( "D-Day", "d\\-day", monthDay 6 6 )
+  , ( "Day After Christmas Day", "day after christmas day", monthDay 12 26 )
+  , ( "Elizabeth Peratrovich Day", "elizabeth peratrovich day", monthDay 2 16 )
+  , ( "Emancipation Day", "emancipation day", monthDay 4 16 )
+  , ( "Evacuation Day", "evacuation day", monthDay 3 17 )
+  , ( "Father Damien Day", "father damien day", monthDay 4 15 )
+  , ( "Feast of Our Lady of Guadalupe", "feast of our lady of guadalupe", monthDay 12 12 )
+  , ( "Flag Day", "flag day", monthDay 6 14 )
+  , ( "Groundhog Day", "groundhogs? day", monthDay 2 2 )
+  , ( "Harvey Milk Day", "harvey milk day", monthDay 5 22 )
+  , ( "Inauguration Day", "inauguration day", monthDay 1 20 )
+  , ( "Independence Day", "independence day", monthDay 7 4 )
+  , ( "Juneteenth", "juneteenth", monthDay 6 19 )
+  , ( "Kamehameha Day", "kamehameha day", monthDay 6 11 )
+  , ( "Kansas Day", "kansas day", monthDay 1 29 )
+  , ( "Kent State Shootings Remembrance", "kent state shootings remembrance", monthDay 5 4 )
+  , ( "Loyalty Day", "l(aw|ei|oyalty) day", monthDay 5 1 )
+  , ( "Leif Erikson Day", "leif erikson day", monthDay 10 9 )
+  , ( "Lincoln's Birthday", "(abraham )?lincoln'?s?'? birthday", monthDay 2 12 )
+  , ( "Linus Pauling Day", "linus pauling day", monthDay 2 28 )
+  , ( "Lyndon Baines Johnson Day", "lyndon baines johnson day", monthDay 8 27 )
+  , ( "Marine Corps Birthday", "marine corps (birth)?day", monthDay 11 10 )
+  , ( "Maryland Day", "maryland day", monthDay 3 25 )
+  , ( "National Aviation Day", "national aviation day", monthDay 8 19 )
+  , ( "National Freedom Day", "national freedom day", monthDay 2 1 )
+  , ( "National Guard Birthday", "national guard (birth)?day", monthDay 12 13 )
+  , ( "National Korean War Veterans Armistice Day", "national korean war veterans armistice day", monthDay 7 27 )
+  , ( "National Maritime Day", "national maritime day", monthDay 5 22 )
+  , ( "National Missing Children's Day", "national missing children'?s day", monthDay 5 25 )
+  , ( "National Nurses Day", "national nurses day", monthDay 5 6 )
+  , ( "National Tartan Day", "national tartan day", monthDay 4 6 )
+  , ( "Navy Birthday", "(u\\.?s\\.? )?navy (birth)?day", monthDay 10 13 )
+  , ( "Oklahoma Day", "oklahoma day", monthDay 4 22 )
+  , ( "Pan American Aviation Day", "pan american aviation day", monthDay 12 17 )
+  , ( "Pascua Florida Day", "pascua florida day", monthDay 4 2 )
+  , ( "Patriot Day", "patriot day", monthDay 9 11 )
+  , ( "Peace Officers Memorial Day", "peace officers memorial day", monthDay 5 15 )
+  , ( "Pearl Harbor Remembrance Day", "pearl harbor remembrance day", monthDay 12 7 )
+  , ( "Pioneer Day", "pioneer day", monthDay 7 24 )
+  , ( "Prince Jonah Kuhio Kalanianaole Day", "prince jonah kuhio kalanianaole day", monthDay 3 26 )
+  , ( "Purple Heart Day", "purple heart day", monthDay 8 7 )
+  , ( "Read Across America Day", "read across america day", monthDay 3 2 )
+  , ( "Rhode Island Independence Day", "rhode island independence day", monthDay 5 4 )
+  , ( "Rosa Parks Day", "rosa parks day", monthDay 2 4 )
+  , ( "San Jacinto Day", "san jacinto day", monthDay 4 21 )
+  , ( "Self-Injury Awareness Day", "self\\-injury awareness day", monthDay 3 1 )
+  , ( "Senior Citizens Day", "senior citizens day", monthDay 8 21 )
+  , ( "St Nicholas' Day", "st\\.? nicholas'? day", monthDay 12 6 )
+  , ( "St. David's Day", "st\\.? david'?s day", monthDay 3 1 )
+  , ( "Statehood Day", "statehood day", monthDay 6 1 )
+  , ( "Statehood Day in Arizona", "statehood day in arizona", monthDay 2 14 )
+  , ( "Stephen Foster Memorial Day", "stephen foster memorial day", monthDay 1 13 )
+  , ( "Susan B Anthony's Birthday", "susan b\\.? anthony'?s birthday", monthDay 2 15 )
+  , ( "Texas Independence Day", "texas independence day", monthDay 3 2 )
+  , ( "Thomas Jefferson's Birthday", "thomas jefferson'?s birthday", monthDay 4 13 )
+  , ( "Truman Day", "truman day", monthDay 5 8 )
+  , ( "Veterans Day", "veterans day", monthDay 11 11 )
+  , ( "West Virginia Day", "west virginia day", monthDay 6 20 )
+  , ( "White Cane Safety Day", "white cane safety day", monthDay 10 15 )
+  , ( "Women's Equality Day", "women'?s equality day", monthDay 8 26 )
+  , ( "Wright Brothers Day", "wright brothers day", monthDay 12 17 )
+
+  -- Fixed day/week/month, year over year
+  , ( "Arbor Day", "arbor day", predLastOf (dayOfWeek 5) (month 4) )
+  , ( "Armed Forces Day", "armed forces day", nthDOWOfMonth 3 6 5 )
+  , ( "Casimir Pulaski Day", "casimir pulaski day", nthDOWOfMonth 1 1 3 )
+  , ( "Child Health Day", "child health day", nthDOWOfMonth 1 1 10 )
+  , ( "Columbus Day", "columbus day", nthDOWOfMonth 2 1 10 )
+  -- Saturday after Labor Day
+  , ( "Carl Garner Federal Lands Cleanup Day"
+    , "carl garner federal lands cleanup day"
+    , cycleNthAfter False TG.Day 5 $ nthDOWOfMonth 1 1 9 )
+  -- Monday after Thanksgiving
+  , ( "Cyber Monday", "cyber monday"
+    , cycleNthAfter False TG.Day 4 $ nthDOWOfMonth 4 4 11 )
+  , ( "Election Day", "election day"
+    , cycleNthAfter False TG.Day 1 $ nthDOWOfMonth 1 1 11 )
+  , ( "Employee Appreciation Day", "employee appreciation day"
+    , nthDOWOfMonth 1 5 3 )
+  , ( "Friendship Day", "friendship day", nthDOWOfMonth 1 7 8 )
+  , ( "Gold Star Mother's Day", "gold star mother's day"
+    , predLastOf (dayOfWeek 7) (month 9) )
+  , ( "Indigenous People's Day", "indigenous people's day"
+    , nthDOWOfMonth 2 1 10 )
+  , ( "Labor Day", "labor day", nthDOWOfMonth 1 1 9 )
+  -- Long weekend before the first Monday of September
+  , ( "Labor Day weekend", "labor day week(\\s|-)?ends?"
+    , longWEBefore $ nthDOWOfMonth 1 1 9
+    )
+  , ( "Lee Jackson Day", "lee jackson day", nthDOWOfMonth 2 5 1 )
+  -- Last Monday of May
+  , ( "Memorial Day", "(decoration|memorial) day"
+    , predLastOf (dayOfWeek 1) (month 5) )
+  -- Long weekend before the last Monday of May
+  , ( "Memorial Day weekend", "(decoration|memorial) day week(\\s|-)?ends?"
+    , longWEBefore $ predLastOf (dayOfWeek 1) (month 5) )
+  -- 2 days before Mother's Day
+  , ( "Military Spouse Day", "military spouse (appreciation )?day"
+    , cycleNthAfter False TG.Day (- 2) $ nthDOWOfMonth 2 7 5 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "National CleanUp Day", "national clean\\-?up day", nthDOWOfMonth 3 6 9 )
+  , ( "National Day of Prayer", "national day of prayer", nthDOWOfMonth 1 4 5 )
+  , ( "National Defense Transportation Day"
+    , "national defense transportation day"
+    , nthDOWOfMonth 3 5 5 )
+  , ( "National Explosive Ordnance Disposal Day"
+    , "national (eod|explosive ordnance disosal) day"
+    , nthDOWOfMonth 1 6 5 )
+  -- First Sunday after Labor Day
+  , ( "National Grandparents Day", "national grandparents day"
+    , cycleNthAfter False TG.Day 6 $ nthDOWOfMonth 1 1 9 )
+  , ( "National POW/MIA Recognition Day", "national pow/mia recognition day"
+    , nthDOWOfMonth 3 5 9 )
+  , ( "National Wear Red Day", "national wear red day", nthDOWOfMonth 1 5 2 )
+  -- Day after Thanksgiving
+  , ( "Native American Heritage Day"
+    , "(american indian|native american) heritage day"
+    , cycleNthAfter False TG.Day 1 $ nthDOWOfMonth 4 4 11 )
+  , ( "Native Americans' Day", "native americans' day", nthDOWOfMonth 4 1 9 )
+  , ( "Nevada Day", "nevada day", predLastOf (dayOfWeek 5) (month 10) )
+  , ( "Parents' Day", "parents' day", nthDOWOfMonth 4 7 7 )
+  , ( "Patriots' Day", "patriot'?s'? day", nthDOWOfMonth 3 1 4 )
+  , ( "Robert E. Lee Day", "robert e\\. lee day|lee's (birth)?day"
+    , nthDOWOfMonth 3 1 1 )
+  , ( "Seward's Day", "seward's day", predLastOf (dayOfWeek 1) (month 3) )
+  , ( "Statehood Day", "(admission|statehood) day", nthDOWOfMonth 3 5 8 )
+  , ( "Sweetest Day", "sweetest day", nthDOWOfMonth 3 6 10 )
+  , ( "Take our Daughters and Sons to Work Day"
+    , "take our daughters and sons to work day", nthDOWOfMonth 4 4 4 )
+  , ( "Town Meeting Day", "town meeting day", nthDOWOfMonth 1 2 3 )
+  , ( "Victory Day", "victory day", nthDOWOfMonth 2 1 8 )
+  , ( "President's Day"
+    , "(george )?washington'?s? (birth)?day|president'?s?'? day|daisy gatson bates'? day"
+    , nthDOWOfMonth 3 1 2
+    )
+  ]
+
+rulePeriodicHolidays' :: [Rule]
+rulePeriodicHolidays' = mkRuleHolidays'
+  -- Fixed dates, year over year
+  [ ( "Kwanzaa", "kwanzaa", interval TTime.Open (monthDay 12 26) (monthDay 1 1) )
+  ]
+
+rulesBackwardCompatible :: [Rule]
+rulesBackwardCompatible =
   [ ruleMMDD
   , ruleMMDDYYYY
   , ruleMMDDYYYYDot
-  , ruleThanksgiving
   ]
+  ++ ruleBackwardCompatibleHolidays
+
+rules :: [Rule]
+rules = rulesBackwardCompatible
+  ++ rulePeriodicHolidays
+  ++ rulePeriodicHolidays'
diff --git a/Duckling/Time/EN/ZA/Corpus.hs b/Duckling/Time/EN/ZA/Corpus.hs
--- a/Duckling/Time/EN/ZA/Corpus.hs
+++ b/Duckling/Time/EN/ZA/Corpus.hs
@@ -33,29 +33,68 @@
              , "31/10/74"
              , "31-10-74"
              , "31.10.1974"
+             , "31 10 1974"
              ]
   , examples (datetime (2013, 4, 25, 16, 0, 0) Minute)
              [ "4/25 at 4:00pm"
              ]
-  , examples (datetime (2013, 11, 28, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 28, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving day"
              , "thanksgiving"
              , "thanksgiving 2013"
              , "this thanksgiving"
              , "next thanksgiving day"
              ]
-  , examples (datetime (2014, 11, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 11, 27, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving of next year"
              , "thanksgiving 2014"
              ]
-  , examples (datetime (2012, 11, 22, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2012, 11, 22, 0, 0, 0) Day "Thanksgiving Day")
              [ "last thanksgiving"
              , "thanksgiving day 2012"
              ]
-  , examples (datetime (2016, 11, 24, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2016, 11, 24, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2016"
              ]
-  , examples (datetime (2017, 11, 23, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 11, 23, 0, 0, 0) Day "Thanksgiving Day")
              [ "thanksgiving 2017"
+             ]
+  , examples (datetimeHoliday (2013, 12, 16, 0, 0, 0) Day "Day of Reconciliation")
+             [ "day of the vow"
+             , "day of reconciliation"
+             , "day of the covenant"
+             ]
+  , examples (datetimeIntervalHoliday ((2013, 9, 1, 0, 0, 0), (2013, 9, 8, 0, 0, 0)) Day "National Arbor Week")
+             [ "national arbor week"
+             ]
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "Father's Day"
+             ]
+  , examples (datetimeHoliday (2012, 6, 17, 0, 0, 0) Day "Father's Day")
+             [ "last fathers day"
+             ]
+  , examples (datetimeHoliday (1996, 6, 16, 0, 0, 0) Day "Father's Day")
+             [ "fathers day 1996"
+             ]
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Mother's Day")
+             [ "Mother's Day"
+             , "next mothers day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 13, 0, 0, 0) Day "Mother's Day")
+             [ "last mothers day"
+             ]
+  , examples (datetimeHoliday (2014, 5, 11, 0, 0, 0) Day "Mother's Day")
+             [ "mothers day 2014"
+             ]
+  , examples (datetimeHoliday (2013, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day"
+             ]
+  , examples (datetimeHoliday (2012, 5, 1, 0, 0, 0) Day "Labour Day")
+             [ "labour day of last year"
+             , "Labour Day 2012"
+             ]
+  , examples (datetimeHoliday (2013, 10, 10, 0, 0, 0) Day "Heroes' Day")
+             [ "heroes' day"
+             , "kruger day"
              ]
   ]
diff --git a/Duckling/Time/EN/ZA/Rules.hs b/Duckling/Time/EN/ZA/Rules.hs
--- a/Duckling/Time/EN/ZA/Rules.hs
+++ b/Duckling/Time/EN/ZA/Rules.hs
@@ -23,6 +23,7 @@
 import Duckling.Time.Helpers
 import Duckling.Time.Types (TimeData (..))
 import Duckling.Types
+import qualified Duckling.Time.Types as TTime
 
 ruleMMDD :: Rule
 ruleMMDD = Rule
@@ -42,7 +43,7 @@
 ruleDDMMYYYY = Rule
   { name = "dd/mm/yyyy"
   , pattern =
-    [ regex "(3[01]|[12]\\d|0?[1-9])[/-](1[0-2]|0?[1-9])[-/](\\d{2,4})"
+    [ regex "(3[01]|[12]\\d|0?[1-9])[-/\\s](1[0-2]|0?[1-9])[-/\\s](\\d{2,4})"
     ]
   , prod = \tokens -> case tokens of
       (Token RegexMatch (GroupMatch (dd:mm:yy:_)):_) -> do
@@ -69,20 +70,35 @@
       _ -> Nothing
   }
 
--- Fourth Thursday of November
-ruleThanksgiving :: Rule
-ruleThanksgiving = Rule
-  { name = "Thanksgiving Day"
-  , pattern =
-    [ regex "thanks?giving( day)?"
-    ]
-  , prod = \_ -> tt . mkOkForThisNext $ nthDOWOfMonth 4 4 11
-  }
+rulePeriodicHolidays :: [Rule]
+rulePeriodicHolidays = mkRuleHolidays
+  -- Fixed dates, year over year
+  [ ( "Day of Goodwill", "day of goodwill", monthDay 12 26 )
+  , ( "Day of Reconciliation", "day of( the)? (covenant|reconciliation|vow)", monthDay 12 16 )
+  , ( "Heritage Day", "heritage day", monthDay 9 24 )
+  , ( "Heroes' Day", "(heroes'|kruger) day", monthDay 10 10 )
+  , ( "Labour Day", "labour day", monthDay 5 1 )
+  , ( "National Women's Day", "national women'?s day", monthDay 8 9 )
+  , ( "Workers' Day", "workers'? day", monthDay 5 1 )
 
+  -- Fixed day/week/month, year over year
+  , ( "Father's Day", "father'?s?'? day", nthDOWOfMonth 3 7 6 )
+  , ( "Mother's Day", "mother'?s?'? day", nthDOWOfMonth 2 7 5 )
+  , ( "Thanksgiving Day", "thanks?giving( day)?", nthDOWOfMonth 4 4 11 )
+  ]
+
+rulePeriodicHolidays' :: [Rule]
+rulePeriodicHolidays' = mkRuleHolidays'
+  -- Fixed dates, year over year
+  [ ( "National Arbor Week", "national arbor week"
+    , interval TTime.Open (monthDay 9 1) (monthDay 9 7) )
+  ]
+
 rules :: [Rule]
 rules =
   [ ruleMMDD
   , ruleDDMMYYYY
   , ruleDDMMYYYYDot
-  , ruleThanksgiving
   ]
+  ++ rulePeriodicHolidays
+  ++ rulePeriodicHolidays'
diff --git a/Duckling/Time/ES/Corpus.hs b/Duckling/Time/ES/Corpus.hs
--- a/Duckling/Time/ES/Corpus.hs
+++ b/Duckling/Time/ES/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/ES/Rules.hs b/Duckling/Time/ES/Rules.hs
--- a/Duckling/Time/ES/Rules.hs
+++ b/Duckling/Time/ES/Rules.hs
@@ -276,18 +276,6 @@
       _ -> Nothing
   }
 
-ruleSeason4 :: Rule
-ruleSeason4 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "primavera"
-    ]
-  , prod = \_ ->
-      let from = monthDay 3 20
-          to = monthDay 6 21
-      in Token Time <$> interval TTime.Open from to
-  }
-
 ruleYearLatent2 :: Rule
 ruleYearLatent2 = Rule
   { name = "year (latent)"
@@ -689,29 +677,13 @@
       _ -> Nothing
   }
 
-ruleSeason3 :: Rule
-ruleSeason3 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "invierno"
-    ]
-  , prod = \_ ->
-      let from = monthDay 12 21
-          to = monthDay 3 20
-      in Token Time <$> interval TTime.Open from to
-  }
-
-ruleSeason :: Rule
-ruleSeason = Rule
-  { name = "season"
-  , pattern =
-    [ regex "verano"
-    ]
-  , prod = \_ ->
-      let from = monthDay 6 21
-          to = monthDay 9 23
-      in Token Time <$> interval TTime.Open from to
-  }
+ruleSeasons :: [Rule]
+ruleSeasons = mkRuleSeasons
+  [ ( "verano"   , "verano"   , monthDay  6 21, monthDay  9 23 )
+  , ( "otoño"    , "oto(ñ|n)o", monthDay  9 23, monthDay 12 21 )
+  , ( "invierno" , "invierno" , monthDay 12 21, monthDay  3 20 )
+  , ( "primavera", "primavera", monthDay  3 20, monthDay  6 21 )
+  ]
 
 ruleRightNow :: Rule
 ruleRightNow = Rule
@@ -1032,18 +1004,6 @@
   , prod = \_ -> tt . cycleNth TG.Day $ - 1
   }
 
-ruleSeason2 :: Rule
-ruleSeason2 = Rule
-  { name = "season"
-  , pattern =
-    [ regex "oto(ñ|n)o"
-    ]
-  , prod = \_ ->
-      let from = monthDay 9 23
-          to = monthDay 12 21
-      in Token Time <$> interval TTime.Open from to
-  }
-
 ruleDayofweekDayofmonth :: Rule
 ruleDayofweekDayofmonth = Rule
   { name = "<day-of-week> <day-of-month>"
@@ -1389,10 +1349,6 @@
   , rulePasadosNCycle
   , ruleProximasNCycle
   , ruleRightNow
-  , ruleSeason
-  , ruleSeason2
-  , ruleSeason3
-  , ruleSeason4
   , ruleTheDayAfterTomorrow
   , ruleTheDayBeforeYesterday
   , ruleThisDayofweek
@@ -1426,3 +1382,4 @@
   ]
   ++ ruleDaysOfWeek
   ++ ruleMonths
+  ++ ruleSeasons
diff --git a/Duckling/Time/FR/Corpus.hs b/Duckling/Time/FR/Corpus.hs
--- a/Duckling/Time/FR/Corpus.hs
+++ b/Duckling/Time/FR/Corpus.hs
@@ -24,10 +24,10 @@
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale FR Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale FR Nothing}, testOptions, examples)
   where
     examples =
       [ "Ana a un court de tennis"
diff --git a/Duckling/Time/GA/Corpus.hs b/Duckling/Time/GA/Corpus.hs
--- a/Duckling/Time/GA/Corpus.hs
+++ b/Duckling/Time/GA/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/HE/Corpus.hs b/Duckling/Time/HE/Corpus.hs
--- a/Duckling/Time/HE/Corpus.hs
+++ b/Duckling/Time/HE/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HE Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HE Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/HR/Corpus.hs b/Duckling/Time/HR/Corpus.hs
--- a/Duckling/Time/HR/Corpus.hs
+++ b/Duckling/Time/HR/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/HU/Corpus.hs b/Duckling/Time/HU/Corpus.hs
--- a/Duckling/Time/HU/Corpus.hs
+++ b/Duckling/Time/HU/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/Helpers.hs b/Duckling/Time/Helpers.hs
--- a/Duckling/Time/Helpers.hs
+++ b/Duckling/Time/Helpers.hs
@@ -8,7 +8,7 @@
 
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoRebindableSyntax #-}
-
+{-# LANGUAGE TupleSections #-}
 
 module Duckling.Time.Helpers
   ( -- Patterns
@@ -22,17 +22,20 @@
   , hourMinute, hourMinuteSecond, inDuration, intersect, intersectDOM, interval
   , inTimezone, longWEBefore, minute, minutesAfter, minutesBefore, mkLatent
   , month, monthDay, notLatent, now, nthDOWOfMonth, partOfDay, predLastOf
-  , predNth, predNthAfter, second, timeOfDayAMPM, weekend, withDirection, year
-  , yearMonthDay, tt
+  , predNth, predNthAfter, predNthClosest, season, second, timeOfDayAMPM
+  , weekday, weekend, withDirection, year, yearMonthDay, tt, durationIntervalAgo
+  , inDurationInterval
     -- Other
-  , getIntValue
+  , getIntValue, timeComputed
   -- Rule constructors
-  , mkRuleInstants, mkRuleDaysOfWeek, mkRuleMonths, mkRuleSeasons
-  , mkRuleHolidays
+  , mkRuleInstants, mkRuleDaysOfWeek, mkRuleMonths, mkRuleMonthsWithLatent
+  , mkRuleSeasons, mkRuleHolidays, mkRuleHolidays'
   ) where
 
 import Data.Maybe
+import Data.Ord (comparing)
 import Data.Text (Text)
+import Data.Tuple.Extra (both)
 import Prelude
 import qualified Data.Time as Time
 import qualified Data.Time.Calendar.WeekDate as Time
@@ -74,9 +77,20 @@
 timeNegPeriod (DurationData v g) = DurationData
   {TDuration.grain = g, TDuration.value = negate v}
 
+timeShiftPeriod :: Int -> DurationData -> DurationData
+timeShiftPeriod n dd@DurationData{TDuration.value = v} =
+  dd{TDuration.value = v + n}
+
 -- -----------------------------------------------------------------
 -- Time predicates
 
+timeComputed :: [TTime.TimeObject] -> TTime.Predicate
+timeComputed xs = mkSeriesPredicate series
+  where
+    series t _ = (reverse start, end)
+      where
+        (start, end) = span (flip TTime.timeBefore t) xs
+
 timeCycle :: TG.Grain -> TTime.Predicate
 timeCycle grain = mkSeriesPredicate series
   where
@@ -176,6 +190,27 @@
            [] -> Nothing
            (nth:_) -> Just nth
 
+-- | Take the nth closest value to `basePred` among those yielded by
+-- `cyclicPred`.
+-- n = 0 is the closest value, n = 1 is the second closest value, etc.
+-- n < 0 is treated as n = 0.
+takeNthClosest :: Int -> TTime.Predicate -> TTime.Predicate -> TTime.Predicate
+takeNthClosest n cyclicPred basePred =
+  mkSeriesPredicate $! TTime.timeSeqMap False f basePred
+  where
+  f t ctx = nth (n `max` 0) past future Nothing
+    where
+    (past, future) = runPredicate cyclicPred t ctx
+    nth n pa fu res
+      | n < 0 = res
+      | otherwise = case comparing (against t) x y of
+          GT -> nth (n-1) (tailSafe pa) fu x
+          _ -> nth (n-1) pa (tailSafe fu) y
+      where (x,y) = both listToMaybe (pa,fu)
+    against t = fmap (negate . TTime.diffStartTime t)
+    tailSafe (_:xs) = xs
+    tailSafe [] = []
+
 -- | Takes the last occurrence of `cyclicPred` within `basePred`.
 takeLastOf :: TTime.Predicate -> TTime.Predicate -> TTime.Predicate
 takeLastOf cyclicPred basePred =
@@ -316,21 +351,26 @@
     res -> Just res
 
 intersect' :: (TimeData, TimeData) -> TimeData
-intersect' (TimeData pred1 _ g1 _ _ d1 _, TimeData pred2 _ g2 _ _ d2 _)
+intersect' (TimeData pred1 _ g1 _ _ d1 _ h1, TimeData pred2 _ g2 _ _ d2 _ h2)
   | g1 < g2 = TTime.timedata'
     { TTime.timePred = timeCompose pred1 pred2
     , TTime.timeGrain = g1
     , TTime.direction = dir
+    , TTime.holiday = hol
     }
   | otherwise = TTime.timedata'
     { TTime.timePred = timeCompose pred2 pred1
     , TTime.timeGrain = g2
     , TTime.direction = dir
+    , TTime.holiday = hol
     }
   where
     dir = case catMaybes [d1, d2] of
       [] -> Nothing
       (x:_) -> Just x
+    hol = case catMaybes [h1, h2] of
+      [] -> Nothing
+      (h:_) -> Just h
 
 now :: TimeData
 now = td {TTime.timeGrain = TG.NoGrain}
@@ -381,6 +421,20 @@
 hourMinuteSecond is12H h m s = timeOfDay (Just h) is12H $
   intersect' (intersect' (hour is12H h, minute m), second s)
 
+season :: TimeData
+season = TTime.timedata'
+  { TTime.timePred = TTime.seasonPredicate
+  , TTime.timeGrain = TG.Day
+  }
+
+-- | Note that this function is not the counterpart of `weekend`.
+-- `weekend` returns an interval while `weekday` returns a single day.
+weekday :: TimeData
+weekday = TTime.timedata'
+  { TTime.timePred = TTime.weekdayPredicate
+  , TTime.timeGrain = TG.Day
+  }
+
 cycleN :: Bool -> TG.Grain -> Int -> TimeData
 cycleN notImmediate grain n = TTime.timedata'
   { TTime.timePred = takeN n notImmediate $ timeCycle grain
@@ -414,9 +468,12 @@
 
 -- Generalized version of cycleNth with custom predicate
 predNth :: Int -> Bool -> TimeData -> TimeData
-predNth n notImmediate TimeData {TTime.timePred = p, TTime.timeGrain = g} =
+predNth n notImmediate TimeData
+  {TTime.timePred = p, TTime.timeGrain = g, TTime.holiday = h} =
   TTime.timedata'
-    {TTime.timePred = takeNth n notImmediate p, TTime.timeGrain = g}
+    {TTime.timePred = takeNth n notImmediate p
+    , TTime.timeGrain = g
+    , TTime.holiday = h}
 
 -- Generalized version of `cycleNthAfter` with custom predicate
 predNthAfter :: Int -> TimeData -> TimeData -> TimeData
@@ -426,8 +483,19 @@
     , TTime.timeGrain = g
     }
 
+-- This function can be used to express predicates invoving "closest",
+-- such as "the second closest Monday to Oct 5th"
+predNthClosest :: Int -> TimeData -> TimeData -> TimeData
+predNthClosest n TimeData
+  {TTime.timePred = p, TTime.timeGrain = g, TTime.holiday = h} base =
+  TTime.timedata'
+    { TTime.timePred = takeNthClosest n p $ TTime.timePred base
+    , TTime.timeGrain = g
+    , TTime.holiday = h
+    }
+
 interval' :: TTime.TimeIntervalType -> (TimeData, TimeData) -> TimeData
-interval' intervalType (TimeData p1 _ g1 _ _ _ _, TimeData p2 _ g2 _ _ _ _) =
+interval' intervalType (TimeData p1 _ g1 _ _ _ _ _, TimeData p2 _ g2 _ _ _ _ _) =
   TTime.timedata'
     { TTime.timePred = mkTimeIntervalsPredicate intervalType' p1 p2
     , TTime.timeGrain = min g1 g2
@@ -450,6 +518,9 @@
 durationAgo :: DurationData -> TimeData
 durationAgo dd = inDuration $ timeNegPeriod dd
 
+durationIntervalAgo :: DurationData -> TimeData
+durationIntervalAgo dd = inDurationInterval $ timeNegPeriod dd
+
 durationAfter :: DurationData -> TimeData -> TimeData
 durationAfter dd TimeData {TTime.timePred = pred1, TTime.timeGrain = g} =
   TTime.timedata'
@@ -470,11 +541,18 @@
   where
     t = takeNth 0 False $ timeCycle TG.Second
 
+inDurationInterval :: DurationData -> TimeData
+inDurationInterval dd = interval' TTime.Open
+  (inDuration dd, inDuration $ timeShiftPeriod 1 dd)
+
 inTimezone :: Text -> TimeData -> Maybe TimeData
 inTimezone input td@TimeData {TTime.timePred = p} = do
   tz <- parseTimezone input
   Just $ td {TTime.timePred = shiftTimezone (Series.TimeZoneSeries tz []) p}
 
+withHoliday :: Text -> TimeData -> TimeData
+withHoliday n td = td {TTime.holiday = Just n}
+
 mkLatent :: TimeData -> TimeData
 mkLatent td = td {TTime.latent = True}
 
@@ -568,10 +646,14 @@
       mkSingleRegexRule name ptn . tt . mkOkForThisNext $ dayOfWeek i
 
 mkRuleMonths :: [(Text, String)] -> [Rule]
-mkRuleMonths months  = zipWith go months [1..12]
+mkRuleMonths = mkRuleMonthsWithLatent . map (uncurry (,, False))
+
+mkRuleMonthsWithLatent :: [(Text, String, Bool)] -> [Rule]
+mkRuleMonthsWithLatent months  = zipWith go months [1..12]
   where
-    go (name, ptn) i =
-      mkSingleRegexRule name ptn . tt . mkOkForThisNext $ month i
+    go (name, ptn, latent) i =
+      mkSingleRegexRule name ptn . tt . (if latent then mkLatent else id)
+      . mkOkForThisNext $ month i
 
 mkRuleSeasons :: [(Text, String, TimeData, TimeData)] -> [Rule]
 mkRuleSeasons = map go
@@ -582,4 +664,12 @@
 mkRuleHolidays :: [(Text, String, TimeData)] -> [Rule]
 mkRuleHolidays = map go
   where
-    go (name, ptn, td) = mkSingleRegexRule name ptn . tt $ mkOkForThisNext td
+    go (name, ptn, td) = mkSingleRegexRule name ptn . tt
+      $ withHoliday name $ mkOkForThisNext td
+
+mkRuleHolidays' :: [(Text, String, Maybe TimeData)] -> [Rule]
+mkRuleHolidays' = map go
+  where
+    go (name, ptn, td) = mkSingleRegexRule name ptn $ do
+      td <- td
+      tt $ withHoliday name $ mkOkForThisNext td
diff --git a/Duckling/Time/IT/Corpus.hs b/Duckling/Time/IT/Corpus.hs
--- a/Duckling/Time/IT/Corpus.hs
+++ b/Duckling/Time/IT/Corpus.hs
@@ -24,10 +24,10 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale IT Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale IT Nothing}, testOptions, examples)
   where
     examples =
       [ "ma"
diff --git a/Duckling/Time/KO/Corpus.hs b/Duckling/Time/KO/Corpus.hs
--- a/Duckling/Time/KO/Corpus.hs
+++ b/Duckling/Time/KO/Corpus.hs
@@ -23,7 +23,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/NB/Corpus.hs b/Duckling/Time/NB/Corpus.hs
--- a/Duckling/Time/NB/Corpus.hs
+++ b/Duckling/Time/NB/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.Testing.Types hiding (examples)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NB Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NB Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/NL/Corpus.hs b/Duckling/Time/NL/Corpus.hs
--- a/Duckling/Time/NL/Corpus.hs
+++ b/Duckling/Time/NL/Corpus.hs
@@ -27,10 +27,10 @@
 context = testContext {locale = makeLocale NL Nothing}
 
 corpus :: Corpus
-corpus = (context, allExamples)
+corpus = (context, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (context, examples)
+negativeCorpus = (context, testOptions, examples)
   where
     examples =
       [ "een hotel"
@@ -420,39 +420,37 @@
   , examples (datetimeInterval ((2012, 12, 21, 0, 0, 0), (2013, 3, 21, 0, 0, 0)) Day)
              [ "deze winter"
              ]
-  , examples (datetime (2013, 12, 25, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 25, 0, 0, 0) Day "Kerstmis")
              [ "kerst"
              , "kerstmis"
              ]
-  , examples (datetime (2013, 12, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 31, 0, 0, 0) Day "Oudjaar")
              [ "oudjaar"
              , "oudejaarsavond"
              ]
-  , examples (datetime (2014, 1, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2014, 1, 1, 0, 0, 0) Day "Nieuwjaarsdag")
              [ "nieuwjaarsdag"
              , "nieuwjaar"
              ]
-  , examples (datetime (2013, 2, 14, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 2, 14, 0, 0, 0) Day "Valentijnsdag")
              [ "Valentijnsdag"
              ]
-  , examples (datetime (2013, 5, 12, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 5, 12, 0, 0, 0) Day "Moederdag")
              [ "moederdag"
-             , "tweede zondag in mei"
              ]
-  , examples (datetime (2013, 6, 16, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 6, 16, 0, 0, 0) Day "Vaderdag")
              [ "vaderdag"
-             , "derde zondag in juni"
              ]
-  , examples (datetime (2017, 04, 27, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2017, 04, 27, 0, 0, 0) Day "Koningsdag")
              [ "Koningsdag 2017"
              ]
-  , examples (datetime (2013, 10, 31, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 10, 31, 0, 0, 0) Day "Halloween")
              [ "Halloween"
              ]
-  , examples (datetime (2013, 11, 1, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 11, 1, 0, 0, 0) Day "Allerheiligen")
              [ "Allerheiligen"
              ]
-  , examples (datetime (2013, 12, 5, 0, 0, 0) Day)
+  , examples (datetimeHoliday (2013, 12, 5, 0, 0, 0) Day "Sinterklaas")
              [ "Sinterklaas"
              , "Pakjesavond"
              , "Sinterklaasavond"
diff --git a/Duckling/Time/NL/Rules.hs b/Duckling/Time/NL/Rules.hs
--- a/Duckling/Time/NL/Rules.hs
+++ b/Duckling/Time/NL/Rules.hs
@@ -81,29 +81,29 @@
 
 ruleHolidays :: [Rule]
 ruleHolidays = mkRuleHolidays
-  [ ( "new year's day"      , "nieuwjaars?(dag)?"
+  [ ( "Nieuwjaarsdag"      , "nieuwjaars?(dag)?"
     , monthDay  1  1 )
-  , ( "valentine's day"     , "valentijns?(dag)?"
+  , ( "Valentijnsdag"     , "valentijns?(dag)?"
     , monthDay  2 14 )
-  , ( "halloween day"       , "hall?oween?"
+  , ( "Halloween"       , "hall?oween?"
     , monthDay 10 31 )
-  , ( "Dutch King day"      , "konings?dag"
+  , ( "Koningsdag"      , "konings?dag"
     , monthDay  4 27 )
   , ( "Allerheiligen"       , "allerheiligen?|aller heiligen?"
     , monthDay 11  1 )
   , ( "Sinterklaas"         , "sinterklaas(avond)?|pakjesavond"
     , monthDay 12  5 )
-  , ( "christmas eve"       , "kerstavond"
+  , ( "Kerstavond"       , "kerstavond"
     , monthDay 12 24 )
-  , ( "boxing day christmas", "tweede kerstdag"
+  , ( "Tweede Kerstdag", "tweede kerstdag"
     , monthDay 12 26 )
-  , ( "christmas"           , "kerstmis|(eerste )?kerstdag|kerst"
+  , ( "Kerstmis"           , "kerstmis|(eerste )?kerstdag|kerst"
     , monthDay 12 25 )
-  , ( "new year's eve"      , "oudjaar|oudejaars?avond"
+  , ( "Oudjaar"      , "oudjaar|oudejaars?avond"
     , monthDay 12 31 )
-  , ( "Mother's Day"        , "moederdag"
+  , ( "Moederdag"        , "moederdag"
     , nthDOWOfMonth 2 7 5 )
-  , ( "Father's Day"        , "vaderdag"
+  , ( "Vaderdag"        , "vaderdag"
     , nthDOWOfMonth 3 7 6 )
   ]
 
diff --git a/Duckling/Time/PL/Corpus.hs b/Duckling/Time/PL/Corpus.hs
--- a/Duckling/Time/PL/Corpus.hs
+++ b/Duckling/Time/PL/Corpus.hs
@@ -24,10 +24,10 @@
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PL Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale PL Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale PL Nothing}, testOptions, examples)
   where
     examples =
       [ "nie"
@@ -155,6 +155,17 @@
              , "8 Sie."
              , "Ósmy Sie."
              , "Osmego Sie."
+             ]
+  , examples (datetime (2013, 11, 20, 0, 0, 0) Day)
+             [ "20 listopada"
+             , "20 listopadowi"
+             , "20 listopadem"
+             , "20 listopad"
+             ]
+  , examples (datetime (2013, 5, 20, 0, 0, 0) Day)
+             [ "20 maja"
+             , "20 maj"
+             , "20 majem"
              ]
   , examples (datetime (2014, 10, 0, 0, 0, 0) Month)
              [ "Październik 2014"
diff --git a/Duckling/Time/PL/Rules.hs b/Duckling/Time/PL/Rules.hs
--- a/Duckling/Time/PL/Rules.hs
+++ b/Duckling/Time/PL/Rules.hs
@@ -54,18 +54,18 @@
 
 ruleMonths :: [Rule]
 ruleMonths = mkRuleMonths
-  [ ( "January" , "styczeń|styczen|stycznia|styczniowi|styczniem|styczniu|sty(cz)?\\.?" )
-  , ( "February" , "luty|lutego|lutemu|lut?\\.?" )
-  , ( "March" , "marzec|marca|marcowi|marcem|marcu|marz?\\.?" )
-  , ( "April" , "kwiecień|kwiecien|kwietnia|kwietniowi|kwietniem|kwietniu|kwiet?\\.?" )
-  , ( "May" , "maj|maja|majowi|majem|maju" )
-  , ( "June" , "czerwiec|czerwca|czerwcowi|czerwcem|czerwcu|czer?\\.?" )
-  , ( "July" , "lipiec|lipca|lipcowi|lipcem|lipcu|lip\\.?" )
-  , ( "August" , "sierpień|sierpien|sierpnia|sierpniowi|sierpniem|sierpniu|sierp\\.?|sier\\.?|sie\\.?" )
-  , ( "September" , "wrzesień|wrzesien|września|wrzesnia|wrześniowi|wrzesniowi|wrzesień|wrzesien|wrześniem|wrzesniem|wrześniu|wrzesniu|wrz\\.?|wrze\\.?" )
+  [ ( "January" , "stycz(eń|en|nia|niowi|niem|niu)|sty(cz)?\\.?" )
+  , ( "February" , "lu(ty|tego|temu|t?\\.?)" )
+  , ( "March" , "mar(zec|ca|cowi|cem|cu|z?\\.?)" )
+  , ( "April" , "kwie(cień|cien|tnia|tniowi|tniem|tniu|t?\\.?)" )
+  , ( "May" , "maj(a|owi|em|u)?" )
+  , ( "June" , "czerw(iec|ca|cowi|cem|cu)|czer?\\.?" )
+  , ( "July" , "lip(iec|ca|cowi|cem|cu)|lip\\.?" )
+  , ( "August" , "sierp(ie(n|ń)|ni(a|owi|em|u))|sierp\\.?|sier\\.?|sie\\.?" )
+  , ( "September" , "wrze(s|ś)(ie(ń|n)|ni(a|owi|em|u))|wrz\\.?|wrze\\.?" )
   , ( "October" , "pa(z|ź)dziernik(a|owi|iem|u)?|paź\\.?|paz\\.?" )
-  , ( "November" , "listopad|listopada|listopadowi|listopadem|listopadzie|lis\\.?|list\\.?" )
-  , ( "December" , "grudzień|grudzien|grudnia|grudniowi|grudniem|grudniu|gru\\.?|grud\\.?" )
+  , ( "November" , "listopad(a|owi|em|zie)?|lis\\.?|list\\.?" )
+  , ( "December" , "grudz(ień|ien)|grudn(ia|iowi|iem|niu)|gru\\.?|grud\\.?" )
   ]
 
 ruleRelativeMinutesTotillbeforeIntegerHourofday :: Rule
diff --git a/Duckling/Time/PT/Corpus.hs b/Duckling/Time/PT/Corpus.hs
--- a/Duckling/Time/PT/Corpus.hs
+++ b/Duckling/Time/PT/Corpus.hs
@@ -24,10 +24,10 @@
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext {locale = makeLocale PT Nothing}, examples)
+negativeCorpus = (testContext {locale = makeLocale PT Nothing}, testOptions, examples)
   where
     examples =
       [ "no 987"
diff --git a/Duckling/Time/RO/Corpus.hs b/Duckling/Time/RO/Corpus.hs
--- a/Duckling/Time/RO/Corpus.hs
+++ b/Duckling/Time/RO/Corpus.hs
@@ -23,14 +23,14 @@
 import Duckling.Testing.Types hiding (examples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "sa"
       ]
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/SV/Corpus.hs b/Duckling/Time/SV/Corpus.hs
--- a/Duckling/Time/SV/Corpus.hs
+++ b/Duckling/Time/SV/Corpus.hs
@@ -23,7 +23,7 @@
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale SV Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale SV Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Time/Types.hs b/Duckling/Time/Types.hs
--- a/Duckling/Time/Types.hs
+++ b/Duckling/Time/Types.hs
@@ -16,15 +16,16 @@
 
 module Duckling.Time.Types where
 
-import Control.Applicative ((<|>))
 import Control.Arrow ((***))
 import Control.DeepSeq
 import Control.Monad (join)
 import Data.Aeson
+import Data.Foldable (find)
 import Data.Hashable
 import Data.Maybe
 import Data.Monoid
 import Data.Text (Text)
+import Data.Tuple.Extra (both)
 import GHC.Generics
 import Prelude
 import TextShow (showt)
@@ -65,18 +66,19 @@
   , form :: Maybe Form
   , direction :: Maybe IntervalDirection
   , okForThisNext :: Bool -- allows specific this+Time
+  , holiday :: Maybe Text
   }
 
 instance Eq TimeData where
-  (==) (TimeData _ l1 g1 n1 f1 d1 _) (TimeData _ l2 g2 n2 f2 d2 _) =
+  (==) (TimeData _ l1 g1 n1 f1 d1 _ _) (TimeData _ l2 g2 n2 f2 d2 _ _) =
     l1 == l2 && g1 == g2 && n1 == n2 && f1 == f2 && d1 == d2
 
 instance Hashable TimeData where
-  hashWithSalt s (TimeData _ latent grain imm form dir _) = hashWithSalt s
+  hashWithSalt s (TimeData _ latent grain imm form dir _ _) = hashWithSalt s
     (0::Int, (latent, grain, imm, form, dir))
 
 instance Ord TimeData where
-  compare (TimeData _ l1 g1 n1 f1 d1 _) (TimeData _ l2 g2 n2 f2 d2 _) =
+  compare (TimeData _ l1 g1 n1 f1 d1 _ _) (TimeData _ l2 g2 n2 f2 d2 _ _) =
     case compare g1 g2 of
       EQ -> case compare f1 f2 of
         EQ -> case compare l1 l2 of
@@ -88,12 +90,13 @@
       z -> z
 
 instance Show TimeData where
-  show (TimeData _ latent grain _ form dir _) =
+  show (TimeData _ latent grain _ form dir _ holiday) =
     "TimeData{" ++
     "latent=" ++ show latent ++
     ", grain=" ++ show grain ++
     ", form=" ++ show form ++
     ", direction=" ++ show dir ++
+    ", holiday=" ++ show holiday ++
     "}"
 
 instance NFData TimeData where
@@ -101,8 +104,8 @@
 
 instance Resolve TimeData where
   type ResolvedValue TimeData = TimeValue
-  resolve _ TimeData {latent = True} = Nothing
-  resolve context TimeData {timePred, notImmediate, direction} = do
+  resolve _ Options {withLatent = False} TimeData {latent = True} = Nothing
+  resolve context _ TimeData {timePred, latent, notImmediate, direction, holiday} = do
     value <- case future of
       [] -> listToMaybe past
       ahead:nextAhead:_
@@ -110,10 +113,10 @@
       ahead:_ -> Just ahead
     values <- Just . take 3 $ if List.null future then past else future
     Just $ case direction of
-      Nothing -> TimeValue (timeValue tzSeries value) $
-        map (timeValue tzSeries) values
-      Just d -> TimeValue (openInterval tzSeries d value) $
-        map (openInterval tzSeries d) values
+      Nothing -> (TimeValue (timeValue tzSeries value)
+        (map (timeValue tzSeries) values) holiday, latent)
+      Just d -> (TimeValue (openInterval tzSeries d value)
+        (map (openInterval tzSeries d) values) holiday, latent)
     where
       DucklingTime (Series.ZoneSeriesTime utcTime tzSeries) = referenceTime context
       refTime = TimeObject
@@ -138,6 +141,7 @@
   , form = Nothing
   , direction = Nothing
   , okForThisNext = False
+  , holiday = Nothing
   }
 
 data TimeContext = TimeContext
@@ -164,7 +168,7 @@
   | OpenIntervalValue (InstantValue, IntervalDirection)
   deriving (Show, Eq)
 
-data TimeValue = TimeValue SingleTimeValue [SingleTimeValue]
+data TimeValue = TimeValue SingleTimeValue [SingleTimeValue] (Maybe Text)
   deriving (Show, Eq)
 
 instance ToJSON InstantValue where
@@ -192,9 +196,14 @@
     ]
 
 instance ToJSON TimeValue where
-  toJSON (TimeValue value values) = case toJSON value of
-    Object o -> Object $ H.insert "values" (toJSON values) o
+  toJSON (TimeValue value values holiday) = case toJSON value of
+    Object o ->
+      Object $ insertHoliday holiday $ H.insert "values" (toJSON values) o
     _ -> Object H.empty
+    where
+      insertHoliday :: Maybe Text -> Object -> Object
+      insertHoliday Nothing obj = obj
+      insertHoliday (Just h) obj = H.insert "holidayBeta" (toJSON h) obj
 
 -- | Return a tuple of (past, future) elements
 type SeriesPredicate = TimeObject -> TimeContext -> ([TimeObject], [TimeObject])
@@ -202,6 +211,12 @@
 data AMPM = AM | PM
   deriving (Eq, Show)
 
+data SeasonName = Spring | Summer | Fall | Winter deriving (Enum,Eq,Ord,Show)
+
+-- | Regular seasons of the Northern Hemisphere.
+data Season = Season { startYear :: Integer, seasonName :: SeasonName }
+  deriving (Eq,Ord,Show)
+
 newtype NoShow a = NoShow a
 
 instance Show (NoShow a) where
@@ -337,9 +352,78 @@
   -- SeriesPredicate might contain one, but we'll underapproximate for
   -- now
 
+-- Computes the difference of the start time of two `TimeObject`s.
+diffStartTime :: TimeObject -> TimeObject -> Time.NominalDiffTime
+diffStartTime TimeObject{start = x} TimeObject{start = y} =
+  abs (Time.diffUTCTime x y)
+
 isEmptyPredicate :: Predicate -> Bool
 isEmptyPredicate EmptyPredicate{} = True
 isEmptyPredicate _ = False
+
+seasonStart :: Season -> Time.Day
+seasonStart (Season year Spring) = Time.fromGregorian year 3 20
+seasonStart (Season year Summer) = Time.fromGregorian year 6 21
+seasonStart (Season year Fall) = Time.fromGregorian year 9 23
+seasonStart (Season year Winter) = Time.fromGregorian year 12 21
+
+seasonEnd :: Season -> Time.Day
+seasonEnd = Time.addDays (-1) . seasonStart . nextSeason
+
+nextSeason :: Season -> Season
+nextSeason (Season year Winter) = Season (year+1) Spring
+nextSeason (Season year x) = Season year (succ x)
+
+prevSeason :: Season -> Season
+prevSeason (Season year Spring) = Season (year-1) Winter
+prevSeason (Season year x) = Season year (pred x)
+
+seasonOf :: Time.Day -> Season
+seasonOf day = fromMaybe (Season (year-1) Winter) mbSeason
+  where
+  (year,_,_) = Time.toGregorian day
+  mbSeason = find ((<= day) . seasonStart) $
+               Season year <$> [Winter,Fall,Summer,Spring]
+
+seasonPredicate :: Predicate
+seasonPredicate = mkSeriesPredicate series
+  where
+  series t = const (past,future)
+    where
+    day = Time.utctDay (start t)
+    (past,future) = both (map toTimeObj) (toZipper day)
+    toTimeObj season = TimeObject { start = s, grain = TG.Day, end = Just e }
+      where (s,e) = both toMidnight (seasonStart season, seasonEnd season)
+    toZipper d = (before, currentAndAfter)
+      where
+      current = seasonOf d
+      currentAndAfter = iterate nextSeason current
+      before = iterate prevSeason (prevSeason current)
+
+-- Predicate for weekdays, i.e., Mon to Fri.
+weekdayPredicate :: Predicate
+weekdayPredicate = mkSeriesPredicate series
+  where
+  series t = const (past,future)
+    where
+    day = Time.utctDay (start t)
+    (_,_,dayOfWeek) = Time.toWeekDate day
+    past = toTimeObj . toMidnight . fst <$>
+      iterate prevWeekday (prevWeekday (day,dayOfWeek))
+    future = toTimeObj . toMidnight <$>
+      if dayOfWeek <= 5 then day:days else days
+        where days = fst <$> iterate nextWeekday (nextWeekday (day,dayOfWeek))
+    toTimeObj t = TimeObject { start = t, grain = TG.Day, end = Nothing }
+    nextWeekday (d,dow)
+      | dow < 5 = (Time.addDays 1 d, dow+1)
+      | otherwise = (Time.addDays (toInteger $ 8-dow) d, 1)
+    prevWeekday (d,dow)
+      | dow == 1 = (Time.addDays (-3) d, 5)
+      | dow == 7 = (Time.addDays (-2) d, 5)
+      | otherwise = (Time.addDays (-1) d, dow-1)
+
+toMidnight :: Time.Day -> Time.UTCTime
+toMidnight = flip Time.UTCTime (Time.timeOfDayToTime Time.midnight)
 
 -- Predicate runners
 
diff --git a/Duckling/Time/VI/Corpus.hs b/Duckling/Time/VI/Corpus.hs
--- a/Duckling/Time/VI/Corpus.hs
+++ b/Duckling/Time/VI/Corpus.hs
@@ -22,7 +22,7 @@
 import Duckling.TimeGrain.Types hiding (add)
 
 corpus :: Corpus
-corpus = (context, allExamples)
+corpus = (context, testOptions, allExamples)
   where
     context = testContext
       { locale = makeLocale VI Nothing
diff --git a/Duckling/Time/ZH/Corpus.hs b/Duckling/Time/ZH/Corpus.hs
--- a/Duckling/Time/ZH/Corpus.hs
+++ b/Duckling/Time/ZH/Corpus.hs
@@ -26,7 +26,7 @@
 defaultCorpus = corpus
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ZH Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ZH Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
@@ -401,7 +401,6 @@
   , examples (datetimeInterval ((2012, 12, 0, 0, 0, 0), (2013, 2, 0, 0, 0, 0)) Month)
              [ "上两个月"
              , "上二个月"
-             , "上二月"
              , "前两个月"
              , "前二个月"
              , "前两月"
diff --git a/Duckling/Time/ZH/Rules.hs b/Duckling/Time/ZH/Rules.hs
--- a/Duckling/Time/ZH/Rules.hs
+++ b/Duckling/Time/ZH/Rules.hs
@@ -796,19 +796,6 @@
       _ -> Nothing
   }
 
-ruleLastTuesdayLastJuly :: Rule
-ruleLastTuesdayLastJuly = Rule
-  { name = "last tuesday, last july"
-  , pattern =
-    [ regex "上"
-    , dimension Time
-    ]
-  , prod = \tokens -> case tokens of
-      (_:Token Time td:_) ->
-        tt $ predNth (-1) False td
-      _ -> Nothing
-  }
-
 rulePartofdayDimTime :: Rule
 rulePartofdayDimTime = Rule
   { name = "<part-of-day> <dim time>"
@@ -1014,7 +1001,6 @@
   , ruleNCycleLast
   , ruleLastNight
   , ruleLastTime
-  , ruleLastTuesdayLastJuly
   , ruleLastYear
   , ruleMidnight
   , ruleMmdd
diff --git a/Duckling/TimeGrain/BG/Rules.hs b/Duckling/TimeGrain/BG/Rules.hs
new file mode 100644
--- /dev/null
+++ b/Duckling/TimeGrain/BG/Rules.hs
@@ -0,0 +1,41 @@
+-- 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.TimeGrain.BG.Rules
+  ( rules
+  ) where
+
+import Data.String
+import Data.Text (Text)
+import Prelude
+
+import Duckling.Dimensions.Types
+import Duckling.TimeGrain.Types
+import Duckling.Types
+
+grains :: [(Text, String, Grain)]
+grains = [ ("second (grain) ", "сек(унд(а|и))?",               Second)
+         , ("minute (grain)" , "мин(ут(а|и))?",                Minute)
+         , ("hour (grain)"   , "ч(ас(ове(те)?|а|ът)?)?",       Hour)
+         , ("day (grain)"    , "ден(а|я(т)?)?|дни(те)?",       Day)
+         , ("week (grain)"   , "седмица(та)?|седмици(те)?",    Week)
+         , ("month (grain)"  , "месец(и(те)?|а|ът)?",          Month)
+         , ("quarter (grain)", "тримесечи(я|е(то|та)?)",       Quarter)
+         , ("year (grain)"   , "г(од(ин(а(та)?|и(те)?))?)?",   Year)
+         ]
+
+rules :: [Rule]
+rules = map go grains
+  where
+    go (name, regexPattern, grain) = Rule
+      { name = name
+      , pattern = [regex regexPattern]
+      , prod = \_ -> Just $ Token TimeGrain grain
+      }
diff --git a/Duckling/TimeGrain/EN/Rules.hs b/Duckling/TimeGrain/EN/Rules.hs
--- a/Duckling/TimeGrain/EN/Rules.hs
+++ b/Duckling/TimeGrain/EN/Rules.hs
@@ -9,15 +9,16 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module Duckling.TimeGrain.EN.Rules
-  ( rules ) where
+  ( rules
+  ) where
 
+import Data.String
 import Data.Text (Text)
 import Prelude
-import Data.String
 
 import Duckling.Dimensions.Types
-import qualified Duckling.TimeGrain.Types as TG
 import Duckling.Types
+import qualified Duckling.TimeGrain.Types as TG
 
 grains :: [(Text, String, TG.Grain)]
 grains = [ ("second (grain) ", "sec(ond)?s?",      TG.Second)
@@ -26,8 +27,8 @@
          , ("day (grain)"    , "days?",            TG.Day)
          , ("week (grain)"   , "weeks?",           TG.Week)
          , ("month (grain)"  , "months?",          TG.Month)
-         , ("quarter (grain)", "(quarter|qtr)s?",        TG.Quarter)
-         , ("year (grain)"   , "y(ea)?rs?",           TG.Year)
+         , ("quarter (grain)", "(quarter|qtr)s?",  TG.Quarter)
+         , ("year (grain)"   , "y(ea)?rs?",        TG.Year)
          ]
 
 rules :: [Rule]
diff --git a/Duckling/TimeGrain/Types.hs b/Duckling/TimeGrain/Types.hs
--- a/Duckling/TimeGrain/Types.hs
+++ b/Duckling/TimeGrain/Types.hs
@@ -38,7 +38,7 @@
 
 instance Resolve Grain where
   type ResolvedValue Grain = Grain
-  resolve _ _ = Nothing
+  resolve _ _ _ = Nothing
 
 instance TextShow Grain where
   showb = fromText . Text.toLower . Text.pack . show
diff --git a/Duckling/Types.hs b/Duckling/Types.hs
--- a/Duckling/Types.hs
+++ b/Duckling/Types.hs
@@ -6,34 +6,57 @@
 -- of patent rights can be found in the PATENTS file in the same directory.
 
 
+{-# LANGUAGE AllowAmbiguousTypes #-}
 {-# LANGUAGE DeriveAnyClass #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE ExistentialQuantification #-}
 {-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE NoRebindableSyntax #-}
 {-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
 
 module Duckling.Types where
 
 import Control.DeepSeq
 import Data.Aeson
 import Data.GADT.Compare
+import Data.GADT.Show
 import Data.Hashable
+import Data.HashSet (HashSet)
 import Data.Maybe
-import Data.String
+import Data.Some
 import Data.Text (Text)
-import Data.Typeable ((:~:)(Refl), Typeable)
+import Data.Typeable ((:~:)(Refl), eqT, Typeable)
 import GHC.Generics
 import Prelude
+import TextShow (TextShow(..))
 import qualified Data.ByteString.Lazy as LB
 import qualified Data.Text.Encoding as Text
 import qualified Text.Regex.Base as R
 import qualified Text.Regex.PCRE as PCRE
+import qualified TextShow as TS
 
-import Duckling.Dimensions.Types
+import Duckling.AmountOfMoney.Types (AmountOfMoneyData)
+import Duckling.Distance.Types (DistanceData)
+import Duckling.Duration.Types (DurationData)
+import Duckling.Email.Types (EmailData)
+import Duckling.Locale
+import Duckling.Numeral.Types (NumeralData)
+import Duckling.Ordinal.Types (OrdinalData)
+import Duckling.PhoneNumber.Types (PhoneNumberData)
+import Duckling.Quantity.Types (QuantityData)
+import Duckling.Regex.Types (GroupMatch)
 import Duckling.Resolve
+import Duckling.Temperature.Types (TemperatureData)
+import Duckling.Time.Types (TimeData)
+import Duckling.TimeGrain.Types (Grain)
+import Duckling.Url.Types (UrlData)
+import Duckling.Volume.Types (VolumeData)
 
 -- -----------------------------------------------------------------
 -- Token
@@ -53,6 +76,115 @@
 instance NFData Token where
   rnf (Token _ v) = rnf v
 
+
+-- -----------------------------------------------------------------
+-- Dimension
+
+class (Show a, Typeable a) => CustomDimension a where
+  type DimensionData a
+  dimRules :: a -> [Rule]
+  dimLangRules :: Lang -> a -> [Rule]
+  dimLocaleRules :: Region -> a -> [Rule]
+  dimDependents :: a -> HashSet (Some Dimension)
+
+-- | GADT for differentiating between dimensions
+-- Each dimension should have its own constructor and provide the data structure
+-- for its parsed data
+data Dimension a where
+  RegexMatch :: Dimension GroupMatch
+  AmountOfMoney :: Dimension AmountOfMoneyData
+  Distance :: Dimension DistanceData
+  Duration :: Dimension DurationData
+  Email :: Dimension EmailData
+  Numeral :: Dimension NumeralData
+  Ordinal :: Dimension OrdinalData
+  PhoneNumber :: Dimension PhoneNumberData
+  Quantity :: Dimension QuantityData
+  Temperature :: Dimension TemperatureData
+  Time :: Dimension TimeData
+  TimeGrain :: Dimension Grain
+  Url :: Dimension UrlData
+  Volume :: Dimension VolumeData
+  CustomDimension :: CustomDimension a => a -> Dimension (DimensionData a)
+
+-- Show
+instance Show (Dimension a) where
+  show RegexMatch = "RegexMatch"
+  show Distance = "Distance"
+  show Duration = "Duration"
+  show Email = "Email"
+  show AmountOfMoney = "AmountOfMoney"
+  show Numeral = "Numeral"
+  show Ordinal = "Ordinal"
+  show PhoneNumber = "PhoneNumber"
+  show Quantity = "Quantity"
+  show Temperature = "Temperature"
+  show Time = "Time"
+  show TimeGrain = "TimeGrain"
+  show Url = "Url"
+  show Volume = "Volume"
+  show (CustomDimension dim) = show dim
+instance GShow Dimension where gshowsPrec = showsPrec
+
+-- TextShow
+instance TextShow (Dimension a) where
+  showb d = TS.fromString $ show d
+instance TextShow (Some Dimension) where
+  showb (This d) = showb d
+
+-- Hashable
+instance Hashable (Some Dimension) where
+  hashWithSalt s (This a) = hashWithSalt s a
+instance Hashable (Dimension a) where
+  hashWithSalt s RegexMatch          = hashWithSalt s (0::Int)
+  hashWithSalt s Distance            = hashWithSalt s (1::Int)
+  hashWithSalt s Duration            = hashWithSalt s (2::Int)
+  hashWithSalt s Email               = hashWithSalt s (3::Int)
+  hashWithSalt s AmountOfMoney       = hashWithSalt s (4::Int)
+  hashWithSalt s Numeral             = hashWithSalt s (5::Int)
+  hashWithSalt s Ordinal             = hashWithSalt s (6::Int)
+  hashWithSalt s PhoneNumber         = hashWithSalt s (7::Int)
+  hashWithSalt s Quantity            = hashWithSalt s (8::Int)
+  hashWithSalt s Temperature         = hashWithSalt s (9::Int)
+  hashWithSalt s Time                = hashWithSalt s (10::Int)
+  hashWithSalt s TimeGrain           = hashWithSalt s (11::Int)
+  hashWithSalt s Url                 = hashWithSalt s (12::Int)
+  hashWithSalt s Volume              = hashWithSalt s (13::Int)
+  hashWithSalt s (CustomDimension _) = hashWithSalt s (14::Int)
+
+instance GEq Dimension where
+  geq RegexMatch RegexMatch = Just Refl
+  geq RegexMatch _ = Nothing
+  geq Distance Distance = Just Refl
+  geq Distance _ = Nothing
+  geq Duration Duration = Just Refl
+  geq Duration _ = Nothing
+  geq Email Email = Just Refl
+  geq Email _ = Nothing
+  geq AmountOfMoney AmountOfMoney = Just Refl
+  geq AmountOfMoney _ = Nothing
+  geq Numeral Numeral = Just Refl
+  geq Numeral _ = Nothing
+  geq Ordinal Ordinal = Just Refl
+  geq Ordinal _ = Nothing
+  geq PhoneNumber PhoneNumber = Just Refl
+  geq PhoneNumber _ = Nothing
+  geq Quantity Quantity = Just Refl
+  geq Quantity _ = Nothing
+  geq Temperature Temperature = Just Refl
+  geq Temperature _ = Nothing
+  geq Time Time = Just Refl
+  geq Time _ = Nothing
+  geq TimeGrain TimeGrain = Just Refl
+  geq TimeGrain _ = Nothing
+  geq Url Url = Just Refl
+  geq Url _ = Nothing
+  geq Volume Volume = Just Refl
+  geq Volume _ = Nothing
+  geq (CustomDimension (_ :: a)) (CustomDimension (_ :: b))
+    | Just Refl <- eqT :: Maybe (a :~: b) = Just Refl
+  geq (CustomDimension _) _ = Nothing
+
 isDimension :: Dimension a -> Token -> Bool
 isDimension dim (Token dim' _) = isJust $ geq dim dim'
 
@@ -67,12 +199,15 @@
   { range :: Range
   , node :: Node
   , jsonValue :: Value
+  , isLatent :: Bool
   } deriving (Eq, Show)
 
 instance Ord ResolvedToken where
-  compare (Resolved range1 _ json1) (Resolved range2 _ json2) =
+  compare (Resolved range1 _ json1 latent1) (Resolved range2 _ json2 latent2) =
     case compare range1 range2 of
-      EQ -> compare (toJText json1) (toJText json2)
+      EQ -> case compare (toJText json1) (toJText json2) of
+        EQ -> compare latent1 latent2
+        z -> z
       z  -> z
 
 data Candidate = Candidate ResolvedToken Double Bool
@@ -127,21 +262,23 @@
   show (Rule name _ _) = show name
 
 data Entity = Entity
-  { dim   :: Text
-  , body  :: Text
-  , value :: Value
-  , start :: Int
-  , end   :: Int
-  , enode :: Node
+  { dim    :: Text
+  , body   :: Text
+  , value  :: Value
+  , start  :: Int
+  , end    :: Int
+  , latent :: Bool
+  , enode  :: Node
   } deriving (Eq, Generic, Show, NFData)
 
 instance ToJSON Entity where
   toJSON ent = object
-    [ "dim"   .= dim ent
-    , "body"  .= body ent
-    , "value" .= value ent
-    , "start" .= start ent
-    , "end"   .= end ent
+    [ "dim"    .= dim ent
+    , "body"   .= body ent
+    , "value"  .= value ent
+    , "start"  .= start ent
+    , "end"    .= end ent
+    , "latent" .= latent ent
     ]
 
 toJText :: ToJSON x => x -> Text
diff --git a/Duckling/Url/Corpus.hs b/Duckling/Url/Corpus.hs
--- a/Duckling/Url/Corpus.hs
+++ b/Duckling/Url/Corpus.hs
@@ -20,10 +20,10 @@
 import Duckling.Url.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 negativeCorpus :: NegativeCorpus
-negativeCorpus = (testContext, examples)
+negativeCorpus = (testContext, testOptions, examples)
   where
     examples =
       [ "foo"
diff --git a/Duckling/Url/Helpers.hs b/Duckling/Url/Helpers.hs
--- a/Duckling/Url/Helpers.hs
+++ b/Duckling/Url/Helpers.hs
@@ -12,10 +12,8 @@
   ( url
   ) where
 
-import Data.String
 import Data.Text (Text)
 import qualified Data.Text as Text
-import Prelude
 
 import qualified Duckling.Url.Types as TUrl
 import Duckling.Url.Types (UrlData(..))
diff --git a/Duckling/Url/Types.hs b/Duckling/Url/Types.hs
--- a/Duckling/Url/Types.hs
+++ b/Duckling/Url/Types.hs
@@ -19,7 +19,6 @@
 import Data.Aeson
 import Data.Hashable
 import Data.Maybe
-import Data.Monoid
 import Data.Text (Text)
 import GHC.Generics
 import Prelude
@@ -34,7 +33,7 @@
 
 instance Resolve UrlData where
   type ResolvedValue UrlData = UrlData
-  resolve _ x = Just x
+  resolve _ _ x = Just (x, False)
 
 instance ToJSON UrlData where
   toJSON (UrlData value domain) = object
diff --git a/Duckling/Volume/AR/Corpus.hs b/Duckling/Volume/AR/Corpus.hs
--- a/Duckling/Volume/AR/Corpus.hs
+++ b/Duckling/Volume/AR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Volume.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale AR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale AR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/EN/Corpus.hs b/Duckling/Volume/EN/Corpus.hs
--- a/Duckling/Volume/EN/Corpus.hs
+++ b/Duckling/Volume/EN/Corpus.hs
@@ -18,7 +18,7 @@
 import Duckling.Volume.Types
 
 corpus :: Corpus
-corpus = (testContext, allExamples)
+corpus = (testContext, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/ES/Corpus.hs b/Duckling/Volume/ES/Corpus.hs
--- a/Duckling/Volume/ES/Corpus.hs
+++ b/Duckling/Volume/ES/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale ES Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale ES Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/FR/Corpus.hs b/Duckling/Volume/FR/Corpus.hs
--- a/Duckling/Volume/FR/Corpus.hs
+++ b/Duckling/Volume/FR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale FR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale FR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/GA/Corpus.hs b/Duckling/Volume/GA/Corpus.hs
--- a/Duckling/Volume/GA/Corpus.hs
+++ b/Duckling/Volume/GA/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale GA Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale GA Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/HR/Corpus.hs b/Duckling/Volume/HR/Corpus.hs
--- a/Duckling/Volume/HR/Corpus.hs
+++ b/Duckling/Volume/HR/Corpus.hs
@@ -19,7 +19,7 @@
 import Duckling.Volume.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale HR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale HR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/IT/Corpus.hs b/Duckling/Volume/IT/Corpus.hs
--- a/Duckling/Volume/IT/Corpus.hs
+++ b/Duckling/Volume/IT/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale IT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale IT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/KO/Corpus.hs b/Duckling/Volume/KO/Corpus.hs
--- a/Duckling/Volume/KO/Corpus.hs
+++ b/Duckling/Volume/KO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale KO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale KO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/NL/Corpus.hs b/Duckling/Volume/NL/Corpus.hs
--- a/Duckling/Volume/NL/Corpus.hs
+++ b/Duckling/Volume/NL/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale NL Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale NL Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/PT/Corpus.hs b/Duckling/Volume/PT/Corpus.hs
--- a/Duckling/Volume/PT/Corpus.hs
+++ b/Duckling/Volume/PT/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale PT Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale PT Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/RO/Corpus.hs b/Duckling/Volume/RO/Corpus.hs
--- a/Duckling/Volume/RO/Corpus.hs
+++ b/Duckling/Volume/RO/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Testing.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RO Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RO Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/RU/Corpus.hs b/Duckling/Volume/RU/Corpus.hs
--- a/Duckling/Volume/RU/Corpus.hs
+++ b/Duckling/Volume/RU/Corpus.hs
@@ -21,7 +21,7 @@
 import Duckling.Volume.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale RU Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale RU Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/TR/Corpus.hs b/Duckling/Volume/TR/Corpus.hs
--- a/Duckling/Volume/TR/Corpus.hs
+++ b/Duckling/Volume/TR/Corpus.hs
@@ -20,7 +20,7 @@
 import Duckling.Volume.Types
 
 corpus :: Corpus
-corpus = (testContext {locale = makeLocale TR Nothing}, allExamples)
+corpus = (testContext {locale = makeLocale TR Nothing}, testOptions, allExamples)
 
 allExamples :: [Example]
 allExamples = concat
diff --git a/Duckling/Volume/Types.hs b/Duckling/Volume/Types.hs
--- a/Duckling/Volume/Types.hs
+++ b/Duckling/Volume/Types.hs
@@ -43,9 +43,9 @@
 
 instance Resolve VolumeData where
   type ResolvedValue VolumeData = VolumeValue
-  resolve _ VolumeData {unit = Nothing} = Nothing
-  resolve _ VolumeData {unit = Just unit, value} = Just VolumeValue
-    {vValue = value, vUnit = unit}
+  resolve _ _ VolumeData {unit = Nothing} = Nothing
+  resolve _ _ VolumeData {unit = Just unit, value} = Just (VolumeValue
+    {vValue = value, vUnit = unit}, False)
 
 data VolumeValue = VolumeValue
   { vUnit :: Unit
diff --git a/duckling.cabal b/duckling.cabal
--- a/duckling.cabal
+++ b/duckling.cabal
@@ -1,5 +1,5 @@
 name:                duckling
-version:             0.1.4.0
+version:             0.1.5.0
 synopsis:            A Haskell library for parsing text into structured data.
 description:
   Duckling is a library for parsing text into structured data.
@@ -69,6 +69,7 @@
                      , Duckling.Rules.RO
                      , Duckling.Rules.RU
                      , Duckling.Rules.SV
+                     , Duckling.Rules.TA
                      , Duckling.Rules.TR
                      , Duckling.Rules.UK
                      , Duckling.Rules.VI
@@ -112,6 +113,7 @@
                      , Duckling.Ranking.Classifiers.RO_XX
                      , Duckling.Ranking.Classifiers.RU_XX
                      , Duckling.Ranking.Classifiers.SV_XX
+                     , Duckling.Ranking.Classifiers.TA_XX
                      , Duckling.Ranking.Classifiers.TR_XX
                      , Duckling.Ranking.Classifiers.UK_XX
                      , Duckling.Ranking.Classifiers.VI_XX
@@ -155,6 +157,7 @@
                      , Duckling.Dimensions.RO
                      , Duckling.Dimensions.RU
                      , Duckling.Dimensions.SV
+                     , Duckling.Dimensions.TA
                      , Duckling.Dimensions.TR
                      , Duckling.Dimensions.UK
                      , Duckling.Dimensions.VI
@@ -191,11 +194,17 @@
                      , Duckling.AmountOfMoney.SV.Rules
                      , Duckling.AmountOfMoney.VI.Corpus
                      , Duckling.AmountOfMoney.VI.Rules
+                     , Duckling.AmountOfMoney.NL.Corpus
+                     , Duckling.AmountOfMoney.NL.Rules
+                     , Duckling.AmountOfMoney.ZH.Corpus
+                     , Duckling.AmountOfMoney.ZH.Rules
                      , Duckling.AmountOfMoney.Helpers
                      , Duckling.AmountOfMoney.Rules
                      , Duckling.AmountOfMoney.Types
 
                      -- Distance
+                     , Duckling.Distance.BG.Corpus
+                     , Duckling.Distance.BG.Rules
                      , Duckling.Distance.CS.Corpus
                      , Duckling.Distance.CS.Rules
                      , Duckling.Distance.EN.Corpus
@@ -220,6 +229,10 @@
                      , Duckling.Distance.RU.Rules
                      , Duckling.Distance.TR.Corpus
                      , 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
@@ -227,6 +240,8 @@
                      -- Duration
                      , Duckling.Duration.AR.Corpus
                      , Duckling.Duration.AR.Rules
+                     , Duckling.Duration.BG.Corpus
+                     , Duckling.Duration.BG.Rules
                      , Duckling.Duration.DA.Rules
                      , Duckling.Duration.DE.Rules
                      , Duckling.Duration.EL.Corpus
@@ -333,6 +348,8 @@
                      , Duckling.Numeral.RU.Rules
                      , Duckling.Numeral.SV.Corpus
                      , Duckling.Numeral.SV.Rules
+                     , Duckling.Numeral.TA.Corpus
+                     , Duckling.Numeral.TA.Rules
                      , Duckling.Numeral.TR.Corpus
                      , Duckling.Numeral.TR.Rules
                      , Duckling.Numeral.UK.Corpus
@@ -350,6 +367,8 @@
                      -- Ordinal
                      , Duckling.Ordinal.AR.Corpus
                      , Duckling.Ordinal.AR.Rules
+                     , Duckling.Ordinal.BG.Corpus
+                     , Duckling.Ordinal.BG.Rules
                      , Duckling.Ordinal.DA.Corpus
                      , Duckling.Ordinal.DA.Rules
                      , Duckling.Ordinal.DE.Corpus
@@ -543,6 +562,7 @@
                      , Duckling.Time.ZH.MO.Rules
                      , Duckling.Time.ZH.TW.Corpus
                      , Duckling.Time.ZH.TW.Rules
+                     , Duckling.Time.Computed
                      , Duckling.Time.Corpus
                      , Duckling.Time.Helpers
                      , Duckling.Time.Types
@@ -551,6 +571,7 @@
 
                      -- TimeGrain
                      , Duckling.TimeGrain.AR.Rules
+                     , Duckling.TimeGrain.BG.Rules
                      , Duckling.TimeGrain.DA.Rules
                      , Duckling.TimeGrain.DE.Rules
                      , Duckling.TimeGrain.EN.Rules
@@ -670,9 +691,12 @@
                      , Duckling.AmountOfMoney.RU.Tests
                      , Duckling.AmountOfMoney.SV.Tests
                      , Duckling.AmountOfMoney.VI.Tests
+                     , Duckling.AmountOfMoney.NL.Tests
+                     , Duckling.AmountOfMoney.ZH.Tests
                      , Duckling.AmountOfMoney.Tests
 
                      -- Distance
+                     , Duckling.Distance.BG.Tests
                      , Duckling.Distance.CS.Tests
                      , Duckling.Distance.EN.Tests
                      , Duckling.Distance.ES.Tests
@@ -685,10 +709,13 @@
                      , Duckling.Distance.RO.Tests
                      , Duckling.Distance.RU.Tests
                      , Duckling.Distance.TR.Tests
+                     , Duckling.Distance.SV.Tests
+                     , Duckling.Distance.ZH.Tests
                      , Duckling.Distance.Tests
 
                      -- Duration
                      , Duckling.Duration.AR.Tests
+                     , Duckling.Duration.BG.Tests
                      , Duckling.Duration.EL.Tests
                      , Duckling.Duration.EN.Tests
                      , Duckling.Duration.FR.Tests
@@ -743,6 +770,7 @@
                      , Duckling.Numeral.RO.Tests
                      , Duckling.Numeral.RU.Tests
                      , Duckling.Numeral.SV.Tests
+                     , Duckling.Numeral.TA.Tests
                      , Duckling.Numeral.TR.Tests
                      , Duckling.Numeral.UK.Tests
                      , Duckling.Numeral.VI.Tests
@@ -751,6 +779,7 @@
 
                      -- Ordinal
                      , Duckling.Ordinal.AR.Tests
+                     , Duckling.Ordinal.BG.Tests
                      , Duckling.Ordinal.DA.Tests
                      , Duckling.Ordinal.DE.Tests
                      , Duckling.Ordinal.EL.Tests
@@ -891,6 +920,22 @@
                      , time
                      , timezone-olson        >= 0.1.7 && < 0.2
                      , timezone-series
+                     , unordered-containers
+  default-language:    Haskell2010
+  default-extensions:  OverloadedStrings
+
+executable custom-dimension-example
+  main-is:             CustomDimensionExample.hs
+  hs-source-dirs:      exe
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
+  build-depends:       duckling
+                     , aeson
+                     , base
+                     , deepseq
+                     , dependent-sum
+                     , hashable
+                     , text
+                     , text-show
                      , unordered-containers
   default-language:    Haskell2010
   default-extensions:  OverloadedStrings
diff --git a/exe/CustomDimensionExample.hs b/exe/CustomDimensionExample.hs
new file mode 100644
--- /dev/null
+++ b/exe/CustomDimensionExample.hs
@@ -0,0 +1,82 @@
+-- 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 DeriveAnyClass #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE NoRebindableSyntax #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module Main (main) where
+
+import Control.DeepSeq
+import Control.Monad
+import Data.Aeson
+import Data.Hashable
+import Data.Semigroup ((<>))
+import Data.Some
+import Data.Text (Text)
+import Data.Typeable
+import GHC.Generics
+import Prelude
+import qualified Data.HashSet as HashSet
+import qualified TextShow as TS
+
+import Duckling.Debug
+import Duckling.Locale
+import Duckling.Resolve (Resolve(..))
+import Duckling.Types
+
+data MyDimension = MyDimension deriving (Eq, Show, Typeable)
+
+instance CustomDimension MyDimension where
+  type DimensionData MyDimension = MyData
+  dimRules _ = [myRule]
+  dimLangRules _ _ = []
+  dimLocaleRules _ _ = []
+  dimDependents _ = HashSet.empty
+
+data MyData = MyData
+  { iField :: Int
+  , bField :: Bool
+  , tField :: Text
+  }
+  deriving (Eq, Generic, Hashable, Ord, Show, NFData)
+
+instance Resolve MyData where
+  type ResolvedValue MyData = MyValue
+  resolve _ _ MyData{..} = Just
+    ( MyValue $ TS.showt iField <> "," <> TS.showt bField <> "," <> tField
+    , False )
+
+newtype MyValue = MyValue { value :: Text }
+  deriving (Eq, Ord, Show)
+
+instance ToJSON MyValue where
+  toJSON (MyValue value) = object [ "value" .= value ]
+
+myRule :: Rule
+myRule = Rule
+  { name = "my dimension"
+  , pattern =
+    [ regex "my dimension"
+    ]
+  , prod = \case
+      (_:_) -> Just . Token (CustomDimension MyDimension) $ MyData
+                 { iField = 42
+                 , bField = True
+                 , tField = "hello world"
+                 }
+      _ -> Nothing
+  }
+
+main :: IO ()
+main = do
+  let en = makeLocale EN Nothing
+  debug en "input for my dimension" [This (CustomDimension MyDimension)] >>= print
diff --git a/exe/Duckling/Ranking/Generate.hs b/exe/Duckling/Ranking/Generate.hs
--- a/exe/Duckling/Ranking/Generate.hs
+++ b/exe/Duckling/Ranking/Generate.hs
@@ -161,36 +161,37 @@
 
 getCorpusForLang :: Lang -> Corpus
 getCorpusForLang AR = ARTime.corpus
-getCorpusForLang BG = (testContext, [])
-getCorpusForLang CS = (testContext, [])
+getCorpusForLang BG = (testContext, testOptions, [])
+getCorpusForLang CS = (testContext, testOptions, [])
 getCorpusForLang DA = DATime.corpus
 getCorpusForLang DE = DETime.corpus
 getCorpusForLang EL = ELTime.corpus
 getCorpusForLang EN = ENTime.corpus
 getCorpusForLang ES = ESTime.corpus
-getCorpusForLang ET = (testContext, [])
+getCorpusForLang ET = (testContext, testOptions, [])
 getCorpusForLang FR = FRTime.corpus
 getCorpusForLang GA = GATime.corpus
 getCorpusForLang HR = HRTime.corpus
 getCorpusForLang HE = HETime.corpus
 getCorpusForLang HU = HUTime.corpus
-getCorpusForLang HI = (testContext, [])
-getCorpusForLang ID = (testContext, [])
+getCorpusForLang HI = (testContext, testOptions, [])
+getCorpusForLang ID = (testContext, testOptions, [])
 getCorpusForLang IT = ITTime.corpus
-getCorpusForLang JA = (testContext, [])
-getCorpusForLang KA = (testContext, [])
+getCorpusForLang JA = (testContext, testOptions, [])
+getCorpusForLang KA = (testContext, testOptions, [])
 getCorpusForLang KO = KOTime.corpus
-getCorpusForLang MY = (testContext, [])
+getCorpusForLang MY = (testContext, testOptions, [])
 getCorpusForLang NB = NBTime.corpus
-getCorpusForLang NE = (testContext, [])
+getCorpusForLang NE = (testContext, testOptions, [])
 getCorpusForLang NL = NLTime.corpus
 getCorpusForLang PL = PLTime.corpus
 getCorpusForLang PT = PTTime.corpus
 getCorpusForLang RO = ROTime.corpus
-getCorpusForLang RU = (testContext, [])
+getCorpusForLang RU = (testContext, testOptions, [])
 getCorpusForLang SV = SVTime.corpus
-getCorpusForLang TR = (testContext, [])
-getCorpusForLang UK = (testContext, [])
+getCorpusForLang TA = (testContext, testOptions, [])
+getCorpusForLang TR = (testContext, testOptions, [])
+getCorpusForLang UK = (testContext, testOptions, [])
 getCorpusForLang VI = VITime.corpus
 getCorpusForLang ZH = ZHTime.corpus
 
diff --git a/exe/Duckling/Ranking/Train.hs b/exe/Duckling/Ranking/Train.hs
--- a/exe/Duckling/Ranking/Train.hs
+++ b/exe/Duckling/Ranking/Train.hs
@@ -68,10 +68,10 @@
 -- | Classes:
 -- | 1) True (node contributed to a token passing test predicate)
 -- | 2) False (node didn't contribute to any passing tokens)
-makeDataset1 :: [Rule] -> Context -> Dataset -> Example -> Dataset
-makeDataset1 rules context dataset (sentence, predicate) = dataset'
+makeDataset1 :: [Rule] -> Context -> Options -> Dataset -> Example -> Dataset
+makeDataset1 rules context options dataset (sentence, predicate) = dataset'
   where
-    tokens = parseAndResolve rules sentence context
+    tokens = parseAndResolve rules sentence context options
     (ok, ko) = List.partition (predicate context) tokens
     subnodes :: Node -> HashSet Node
     subnodes node@(Node{..}) = case children of
@@ -92,5 +92,5 @@
 
 -- | Build a dataset (rule name -> datums)
 makeDataset :: [Rule] -> Corpus -> Dataset
-makeDataset rules (context, examples) =
-   List.foldl' (makeDataset1 rules context) HashMap.empty examples
+makeDataset rules (context, options, examples) =
+   List.foldl' (makeDataset1 rules context options) HashMap.empty examples
diff --git a/exe/ExampleMain.hs b/exe/ExampleMain.hs
--- a/exe/ExampleMain.hs
+++ b/exe/ExampleMain.hs
@@ -8,12 +8,12 @@
 
 {-# LANGUAGE OverloadedStrings #-}
 
-import Control.Applicative
+import Control.Applicative hiding (empty)
 import Control.Arrow ((***))
 import Control.Monad (unless)
 import Control.Monad.IO.Class
 import Data.Aeson
-import Data.ByteString (ByteString)
+import Data.ByteString (ByteString, empty)
 import Data.HashMap.Strict (HashMap)
 import Data.Maybe
 import Data.String
@@ -79,6 +79,7 @@
   tz <- getPostParam "tz"
   loc <- getPostParam "locale"
   ref <- getPostParam "reftime"
+  latent <- getPostParam "latent"
 
   case t of
     Nothing -> do
@@ -92,17 +93,19 @@
           { referenceTime = maybe now (parseRefTime timezone) ref
           , locale = maybe (makeLocale (parseLang l) Nothing) parseLocale loc
           }
+        options = Options {withLatent = parseLatent latent}
 
         dimParse = fromMaybe [] $ decode $ LBS.fromStrict $ fromMaybe "" ds
         dims = mapMaybe fromName dimParse
 
-        parsedResult = parse (Text.decodeUtf8 tx) context dims
+        parsedResult = parse (Text.decodeUtf8 tx) context options dims
 
       writeLBS $ encode parsedResult
   where
     defaultLang = EN
     defaultLocale = makeLocale defaultLang Nothing
     defaultTimeZone = "America/Los_Angeles"
+    defaultLatent = False
 
     parseTimeZone :: Maybe ByteString -> Text
     parseTimeZone = fromMaybe defaultTimeZone . fmap Text.decodeUtf8
@@ -125,3 +128,7 @@
       where
         msec = read $ Text.unpack $ Text.decodeUtf8 refTime
         utcTime = posixSecondsToUTCTime $ fromInteger msec / 1000
+
+    parseLatent :: Maybe ByteString -> Bool
+    parseLatent x = fromMaybe defaultLatent
+      (readMaybe (Text.unpack $ Text.toTitle $ Text.decodeUtf8 $ fromMaybe empty x)::Maybe Bool)
diff --git a/tests/Duckling/AmountOfMoney/EN/Tests.hs b/tests/Duckling/AmountOfMoney/EN/Tests.hs
--- a/tests/Duckling/AmountOfMoney/EN/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/EN/Tests.hs
@@ -18,7 +18,7 @@
 import Duckling.AmountOfMoney.EN.Corpus
 import Duckling.Dimensions.Types
 import Duckling.Testing.Asserts
-import Duckling.Testing.Types (testContext)
+import Duckling.Testing.Types (testContext, testOptions)
 import Duckling.Types (Range(..))
 
 tests :: TestTree
@@ -31,7 +31,7 @@
 
 intersectTests :: TestTree
 intersectTests = testCase "Intersect Test" $
-  mapM_ (analyzedNTest testContext . withTargets [This AmountOfMoney]) xs
+  mapM_ (analyzedNTest testContext testOptions . withTargets [This AmountOfMoney]) xs
   where
     xs = [ ("7c7", 2)
          , ("7c7c", 3)
@@ -45,7 +45,7 @@
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
-  mapM_ (analyzedRangeTest testContext . withTargets [This AmountOfMoney]) xs
+  mapM_ (analyzedRangeTest testContext testOptions . withTargets [This AmountOfMoney]) xs
   where
     xs = [ ("between 3 and 1 dollars", Range 14 23)
          , ("between 1 and between 2 and 3 dollars", Range 14 37)
diff --git a/tests/Duckling/AmountOfMoney/NL/Tests.hs b/tests/Duckling/AmountOfMoney/NL/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/NL/Tests.hs
@@ -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.NL.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.AmountOfMoney.NL.Corpus
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "NL Tests"
+  [ makeCorpusTest [This AmountOfMoney] corpus
+  ]
diff --git a/tests/Duckling/AmountOfMoney/Tests.hs b/tests/Duckling/AmountOfMoney/Tests.hs
--- a/tests/Duckling/AmountOfMoney/Tests.hs
+++ b/tests/Duckling/AmountOfMoney/Tests.hs
@@ -6,7 +6,9 @@
 -- of patent rights can be found in the PATENTS file in the same directory.
 
 
-module Duckling.AmountOfMoney.Tests (tests) where
+module Duckling.AmountOfMoney.Tests
+  ( tests
+  ) where
 
 import Data.String
 import Prelude
@@ -22,11 +24,13 @@
 import qualified Duckling.AmountOfMoney.ID.Tests as ID
 import qualified Duckling.AmountOfMoney.KO.Tests as KO
 import qualified Duckling.AmountOfMoney.NB.Tests as NB
+import qualified Duckling.AmountOfMoney.NL.Tests as NL
 import qualified Duckling.AmountOfMoney.PT.Tests as PT
 import qualified Duckling.AmountOfMoney.RO.Tests as RO
 import qualified Duckling.AmountOfMoney.RU.Tests as RU
 import qualified Duckling.AmountOfMoney.SV.Tests as SV
 import qualified Duckling.AmountOfMoney.VI.Tests as VI
+import qualified Duckling.AmountOfMoney.ZH.Tests as ZH
 
 tests :: TestTree
 tests = testGroup "AmountOfMoney Tests"
@@ -40,9 +44,11 @@
   , ID.tests
   , KO.tests
   , NB.tests
+  , NL.tests
   , PT.tests
   , RO.tests
   , RU.tests
   , SV.tests
   , VI.tests
+  , ZH.tests
   ]
diff --git a/tests/Duckling/AmountOfMoney/ZH/Tests.hs b/tests/Duckling/AmountOfMoney/ZH/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/AmountOfMoney/ZH/Tests.hs
@@ -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.AmountOfMoney.ZH.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.AmountOfMoney.ZH.Corpus
+import Duckling.Dimensions.Types
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "ZH Tests"
+  [ makeCorpusTest [This AmountOfMoney] corpus
+  ]
diff --git a/tests/Duckling/Api/Tests.hs b/tests/Duckling/Api/Tests.hs
--- a/tests/Duckling/Api/Tests.hs
+++ b/tests/Duckling/Api/Tests.hs
@@ -40,9 +40,9 @@
 
 parseTest :: TestTree
 parseTest = testCase "Parse Test" $
-  case parse sentence testContext [This Numeral] of
+  case parse sentence testContext testOptions [This Numeral] of
     [] -> assertFailure "empty result"
-    (Entity dim body value start end _:_) -> do
+    (Entity dim body value start end _ _:_) -> do
       assertEqual "dim" "number" dim
       assertEqual "body" "42" body
       assertEqual "value" val (toJText value)
@@ -84,7 +84,7 @@
   where
     check :: (Text, [Some Dimension], [Some Dimension]) -> IO ()
     check (sentence, targets, expected) =
-      let go = analyze sentence testContext $ HashSet.fromList targets
+      let go = analyze sentence testContext testOptions $ HashSet.fromList targets
           actual = flip map go $
                      \(Resolved{node=Node{token=Token d _}}) -> This d
       in assertEqual ("wrong winners for " ++ show sentence) expected actual
@@ -98,12 +98,12 @@
     ]
   where
     check (s, targets) =
-      let tokens = analyze s testContext $ HashSet.fromList targets
+      let tokens = analyze s testContext testOptions $ HashSet.fromList targets
         in assertEqual "wrong ordering" (sortOn range tokens) tokens
 
 rangeTest :: TestTree
 rangeTest = testCase "Range Tests" $ do
-  mapM_ (analyzedFirstTest testContext) xs
+  mapM_ (analyzedFirstTest testContext testOptions) xs
   where
     xs = map (\(input, targets, range) -> (input, targets, f range))
              [ ( "order status 3233763377", [This PhoneNumber], Range 13 23 )
diff --git a/tests/Duckling/Distance/BG/Tests.hs b/tests/Duckling/Distance/BG/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Distance/BG/Tests.hs
@@ -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.Distance.BG.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.BG.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "BG Tests"
+  [ makeCorpusTest [This Distance] corpus
+  ]
diff --git a/tests/Duckling/Distance/EN/Tests.hs b/tests/Duckling/Distance/EN/Tests.hs
--- a/tests/Duckling/Distance/EN/Tests.hs
+++ b/tests/Duckling/Distance/EN/Tests.hs
@@ -7,10 +7,11 @@
 
 
 module Duckling.Distance.EN.Tests
-  ( tests ) where
+  ( tests
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 import Test.Tasty
 
 import Duckling.Dimensions.Types
diff --git a/tests/Duckling/Distance/SV/Tests.hs b/tests/Duckling/Distance/SV/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Distance/SV/Tests.hs
@@ -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.SV.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.SV.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "SV Tests"
+  [ makeCorpusTest [This Distance] corpus
+  ]
diff --git a/tests/Duckling/Distance/Tests.hs b/tests/Duckling/Distance/Tests.hs
--- a/tests/Duckling/Distance/Tests.hs
+++ b/tests/Duckling/Distance/Tests.hs
@@ -6,12 +6,15 @@
 -- of patent rights can be found in the PATENTS file in the same directory.
 
 
-module Duckling.Distance.Tests (tests) where
+module Duckling.Distance.Tests
+  ( tests
+  ) where
 
-import Prelude
 import Data.String
+import Prelude
 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.ES.Tests as ES
@@ -24,10 +27,13 @@
 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"
-  [ CS.tests
+  [ BG.tests
+  , CS.tests
   , EN.tests
   , ES.tests
   , FR.tests
@@ -39,4 +45,6 @@
   , RO.tests
   , RU.tests
   , TR.tests
+  , SV.tests
+  , ZH.tests
   ]
diff --git a/tests/Duckling/Distance/ZH/Tests.hs b/tests/Duckling/Distance/ZH/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Distance/ZH/Tests.hs
@@ -0,0 +1,41 @@
+-- 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 Test.Tasty.HUnit
+
+import Duckling.Dimensions.Types
+import Duckling.Distance.Types
+import Duckling.Distance.ZH.Corpus
+import Duckling.Locale
+import Duckling.Resolve
+import Duckling.Testing.Asserts
+import Duckling.Testing.Types
+
+tests :: TestTree
+tests = testGroup "ZH Tests"
+  [ makeCorpusTest [This Distance] corpus
+  , ambiguousTests
+  ]
+
+ambiguousTests :: TestTree
+ambiguousTests = testCase "Ambiguous Tests" $
+  analyzedAmbiguousTest context testOptions
+    (testText, [This Distance], predicates)
+  where
+    context = testContext {locale = makeLocale ZH Nothing}
+    testText = "3千米"
+    predicates = simpleCheck <$>
+      [ simple Kilometre 3.0
+      , simple Metre 3000.0
+      ]
diff --git a/tests/Duckling/Duration/BG/Tests.hs b/tests/Duckling/Duration/BG/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Duration/BG/Tests.hs
@@ -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.Duration.BG.Tests
+  ( tests
+  ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Duration.BG.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "BG Tests"
+  [ makeCorpusTest [This Duration] corpus
+  ]
diff --git a/tests/Duckling/Duration/Tests.hs b/tests/Duckling/Duration/Tests.hs
--- a/tests/Duckling/Duration/Tests.hs
+++ b/tests/Duckling/Duration/Tests.hs
@@ -15,6 +15,7 @@
 import Test.Tasty
 
 import qualified Duckling.Duration.AR.Tests as AR
+import qualified Duckling.Duration.BG.Tests as BG
 import qualified Duckling.Duration.EL.Tests as EL
 import qualified Duckling.Duration.EN.Tests as EN
 import qualified Duckling.Duration.FR.Tests as FR
@@ -35,6 +36,7 @@
 tests :: TestTree
 tests = testGroup "Duration Tests"
   [ AR.tests
+  , BG.tests
   , EL.tests
   , EN.tests
   , FR.tests
diff --git a/tests/Duckling/Numeral/EN/Tests.hs b/tests/Duckling/Numeral/EN/Tests.hs
--- a/tests/Duckling/Numeral/EN/Tests.hs
+++ b/tests/Duckling/Numeral/EN/Tests.hs
@@ -34,7 +34,8 @@
 
 surroundTests :: TestTree
 surroundTests = testCase "Surround Tests" $
-  mapM_ (analyzedFirstTest testContext . withTargets [This Numeral]) xs
+  mapM_ (analyzedFirstTest testContext testOptions .
+    withTargets [This Numeral]) xs
   where
     xs = concat
       [ examples (NumeralValue 3)
@@ -51,14 +52,14 @@
 
 intersectTests :: TestTree
 intersectTests = testCase "Intersect Test" $
-  mapM_ (analyzedNTest testContext . withTargets [This Numeral]) xs
+  mapM_ (analyzedNTest testContext testOptions . withTargets [This Numeral]) xs
   where
     xs = [ ("10 millions minus 10", 2)
          ]
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
-  mapM_ (analyzedRangeTest testContext . withTargets [This Numeral]) xs
+  mapM_ (analyzedRangeTest testContext testOptions . withTargets [This Numeral]) xs
   where
     xs = [ ("negative negative 5", Range 9 19) -- prevent double negatives
          , ("negative-5", Range 8 10) -- prevent double negatives
diff --git a/tests/Duckling/Numeral/TA/Tests.hs b/tests/Duckling/Numeral/TA/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Numeral/TA/Tests.hs
@@ -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.TA.Tests
+  ( tests ) where
+
+import Data.String
+import Prelude
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Numeral.TA.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "TA Tests"
+  [ makeCorpusTest [This Numeral] corpus
+  ]
diff --git a/tests/Duckling/Numeral/Tests.hs b/tests/Duckling/Numeral/Tests.hs
--- a/tests/Duckling/Numeral/Tests.hs
+++ b/tests/Duckling/Numeral/Tests.hs
@@ -41,6 +41,7 @@
 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.TA.Tests as TA
 import qualified Duckling.Numeral.TR.Tests as TR
 import qualified Duckling.Numeral.UK.Tests as UK
 import qualified Duckling.Numeral.VI.Tests as VI
@@ -77,6 +78,7 @@
   , RO.tests
   , RU.tests
   , SV.tests
+  , TA.tests
   , TR.tests
   , UK.tests
   , VI.tests
diff --git a/tests/Duckling/Ordinal/BG/Tests.hs b/tests/Duckling/Ordinal/BG/Tests.hs
new file mode 100644
--- /dev/null
+++ b/tests/Duckling/Ordinal/BG/Tests.hs
@@ -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.Ordinal.BG.Tests
+  ( tests ) where
+
+import Prelude
+import Data.String
+import Test.Tasty
+
+import Duckling.Dimensions.Types
+import Duckling.Ordinal.BG.Corpus
+import Duckling.Testing.Asserts
+
+tests :: TestTree
+tests = testGroup "BG Tests"
+  [ makeCorpusTest [This Ordinal] corpus
+  ]
diff --git a/tests/Duckling/Ordinal/Tests.hs b/tests/Duckling/Ordinal/Tests.hs
--- a/tests/Duckling/Ordinal/Tests.hs
+++ b/tests/Duckling/Ordinal/Tests.hs
@@ -13,6 +13,7 @@
 import Test.Tasty
 
 import qualified Duckling.Ordinal.AR.Tests as AR
+import qualified Duckling.Ordinal.BG.Tests as BG
 import qualified Duckling.Ordinal.DA.Tests as DA
 import qualified Duckling.Ordinal.DE.Tests as DE
 import qualified Duckling.Ordinal.EL.Tests as EL
@@ -44,6 +45,7 @@
 tests :: TestTree
 tests = testGroup "Ordinal Tests"
   [ AR.tests
+  , BG.tests
   , DA.tests
   , DE.tests
   , EL.tests
diff --git a/tests/Duckling/PhoneNumber/Tests.hs b/tests/Duckling/PhoneNumber/Tests.hs
--- a/tests/Duckling/PhoneNumber/Tests.hs
+++ b/tests/Duckling/PhoneNumber/Tests.hs
@@ -34,7 +34,8 @@
 
 surroundTests :: TestTree
 surroundTests = testCase "Surround Tests" $
-  mapM_ (analyzedFirstTest testContext . withTargets [This PhoneNumber]) xs
+  mapM_ (analyzedFirstTest testContext testOptions .
+    withTargets [This PhoneNumber]) xs
   where
     xs = examples (PhoneNumberValue "06354640807")
                   [ "hey 06354640807"
diff --git a/tests/Duckling/Testing/Asserts.hs b/tests/Duckling/Testing/Asserts.hs
--- a/tests/Duckling/Testing/Asserts.hs
+++ b/tests/Duckling/Testing/Asserts.hs
@@ -11,6 +11,7 @@
 module Duckling.Testing.Asserts
   ( analyzedTargetTest
   , analyzedFirstTest
+  , analyzedAmbiguousTest
   , analyzedNTest
   , analyzedNothingTest
   , analyzedRangeTest
@@ -19,6 +20,7 @@
   , withTargets
   ) where
 
+import Data.List (partition)
 import Data.String
 import Data.Text (Text)
 import Prelude
@@ -37,62 +39,82 @@
 withTargets :: [Some Dimension] -> (Text, a) -> (Text, [Some Dimension], a)
 withTargets targets (input, expected) = (input, targets, expected)
 
-analyzedTargetTest :: Context -> (Text, Some Dimension) -> IO ()
-analyzedTargetTest context (input, target) =
+analyzedTargetTest :: Context -> Options -> (Text, Some Dimension) -> IO ()
+analyzedTargetTest context options (input, target) =
   assertBool msg $ all (== target) dimensions
   where
     msg = "analyze " ++ show (input, [target])
           ++ "dimensions = " ++ show dimensions
-    dimensions = flip map (analyze input context $ HashSet.singleton target) $
+    dimensions = flip map (analyze input context options $ HashSet.singleton target) $
       \(Resolved{node=Node{token=Token dimension _}}) -> This dimension
 
-analyzedFirstTest :: Context -> (Text, [Some Dimension], TestPredicate) -> IO ()
-analyzedFirstTest context (input, targets, predicate) =
+analyzedFirstTest :: Context -> Options ->
+  (Text, [Some Dimension], TestPredicate) -> IO ()
+analyzedFirstTest context options (input, targets, predicate) =
   case tokens of
     [] -> assertFailure ("empty result on " ++ show (input, targets))
     (token:_) -> assertBool ("don't pass predicate on " ++ show input) $
       predicate context token
     where
-      tokens = analyze input context $ HashSet.fromList targets
+      tokens = analyze input context options $ HashSet.fromList targets
 
+analyzedAmbiguousTest :: Context -> Options ->
+  (Text, [Some Dimension], [TestPredicate]) -> IO ()
+analyzedAmbiguousTest context options (input, targets, predicates) =
+  case tokens of
+    [] -> assertFailure ("empty result on " ++ show (input, targets))
+    _ -> assertBool ("don't pass predicate on " ++ show input) $
+      all (\predicate -> any (predicate context) tokens) predicates
+    where
+      tokens = analyze input context options $ HashSet.fromList targets
+
 makeCorpusTest :: [Some Dimension] -> Corpus -> TestTree
-makeCorpusTest targets (context, xs) = testCase "Corpus Tests" $ mapM_ check xs
+makeCorpusTest targets (context, options, xs) = testCase "Corpus Tests" $
+  mapM_ check xs
   where
     dims = HashSet.fromList targets
     check :: Example -> IO ()
-    check (input, predicate) = let tokens = analyze input context dims in
-      case tokens of
-        [] -> assertFailure $ "empty result on " ++ show input
-        (_:_:_) -> assertFailure $
-          show (length tokens) ++ " tokens found for " ++ show input
-        (token:_) -> do
-          assertEqual ("don't fully match " ++ show input)
-            (Range 0 (Text.length input)) (range token)
-          assertBool ("don't pass predicate on " ++ show input) $
-            predicate context token
+    check (input, predicate) =
+      let tokens = analyze input context options dims in
+      let inputRange = Range 0 $ Text.length input in
+      let (fullRangeTokens, restTokens) =
+            partition ((== inputRange) . range) tokens in
+      case fullRangeTokens of
+        [] -> case restTokens of
+          [] -> assertFailure $ "empty result on " ++ show input
+          (_:_:_) -> assertFailure $
+            show (length restTokens) ++ " tokens found for " ++ show input
+          _ -> assertFailure $ "don't fully match " ++ show input
+        [token] -> assertBool ("don't pass predicate on " ++ show input) $
+          predicate context token
+        _ -> assertFailure $ show (length fullRangeTokens)
+          ++ " different ambiguous parses on " ++ show input
 
+
 makeNegativeCorpusTest :: [Some Dimension] -> NegativeCorpus -> TestTree
-makeNegativeCorpusTest targets (context, xs) = testCase "Negative Corpus Tests" $
-  mapM_ (analyzedNothingTest context . (, targets)) xs
+makeNegativeCorpusTest targets (context, options, xs) =
+  testCase "Negative Corpus Tests"
+  $ mapM_ (analyzedNothingTest context options . (, targets)) xs
 
-analyzedRangeTest :: Context -> (Text, [Some Dimension], Range) -> IO ()
-analyzedRangeTest context (input, targets, expRange) = case tokens of
+analyzedRangeTest :: Context -> Options -> (Text, [Some Dimension], Range)
+  -> IO ()
+analyzedRangeTest context options  (input, targets, expRange) = case tokens of
   [] -> assertFailure $ "empty result on " ++ show input
   (_:_:_) -> assertFailure $
     show (length tokens) ++ " tokens found for " ++ show input
   (token:_) ->
     assertEqual ("wrong range for " ++ show input) expRange (range token)
   where
-    tokens = analyze input context $ HashSet.fromList targets
+    tokens = analyze input context options $ HashSet.fromList targets
 
-analyzedNothingTest :: Context -> (Text, [Some Dimension]) -> IO ()
-analyzedNothingTest context (input, targets) =
-  analyzedNTest context (input, targets, 0)
+analyzedNothingTest :: Context -> Options -> (Text, [Some Dimension]) -> IO ()
+analyzedNothingTest context options (input, targets) =
+  analyzedNTest context options (input, targets, 0)
 
-analyzedNTest :: Context -> (Text, [Some Dimension], Int) -> IO ()
-analyzedNTest context (input, targets, n) =
+analyzedNTest :: Context -> Options -> (Text, [Some Dimension], Int) -> IO ()
+analyzedNTest context options (input, targets, n) =
   assertBool msg . (== n) $ length tokens
   where
     msg = "analyze " ++ show (input, targets)
           ++ "tokens= " ++ show tokens
-    tokens = analyze input context $ HashSet.fromList targets
+    tokens = analyze input context options $ HashSet.fromList targets
diff --git a/tests/Duckling/Time/EN/Tests.hs b/tests/Duckling/Time/EN/Tests.hs
--- a/tests/Duckling/Time/EN/Tests.hs
+++ b/tests/Duckling/Time/EN/Tests.hs
@@ -52,6 +52,7 @@
   , intersectTests
   , rangeTests
   , localeTests
+  , makeCorpusTest [This Time] latentCorpus
   ]
 
 localeTests :: TestTree
@@ -121,7 +122,7 @@
 
 exactSecondTests :: TestTree
 exactSecondTests = testCase "Exact Second Tests" $
-  mapM_ (analyzedFirstTest context . withTargets [This Time]) xs
+  mapM_ (analyzedFirstTest context testOptions . withTargets [This Time]) xs
   where
     context = testContext {referenceTime = refTime (2016, 12, 6, 13, 21, 42) 1}
     xs = concat
@@ -131,7 +132,8 @@
       , examples (datetime (2016, 12, 6, 13, 31, 42) Second)
                  [ "in ten minutes"
                  ]
-      , examples (datetimeInterval ((2016, 12, 6, 13, 21, 42), (2016, 12, 12, 0, 0, 0)) Second)
+      , examples (datetimeInterval
+          ((2016, 12, 6, 13, 21, 42), (2016, 12, 12, 0, 0, 0)) Second)
                  [ "by next week"
                  , "by Monday"
                  ]
@@ -139,7 +141,7 @@
 
 valuesTest :: TestTree
 valuesTest = testCase "Values Test" $
-  mapM_ (analyzedFirstTest testContext . withTargets [This Time]) xs
+  mapM_ (analyzedFirstTest testContext testOptions . withTargets [This Time]) xs
   where
     xs = examplesCustom (parserCheck 1 parseValuesSize)
                         [ "now"
@@ -154,7 +156,7 @@
 
 intersectTests :: TestTree
 intersectTests = testCase "Intersect Test" $
-  mapM_ (analyzedNTest testContext . withTargets [This Time]) xs
+  mapM_ (analyzedNTest testContext testOptions . withTargets [This Time]) xs
   where
     xs = [ ("tomorrow July", 2)
          , ("Mar tonight", 2)
@@ -163,7 +165,7 @@
 
 rangeTests :: TestTree
 rangeTests = testCase "Range Test" $
-  mapM_ (analyzedRangeTest testContext . withTargets [This Time]) xs
+  mapM_ (analyzedRangeTest testContext testOptions . withTargets [This Time]) xs
   where
     xs = [ ("at 615.", Range 0 6) -- make sure ruleHHMMLatent allows this
          , ("last in 2'", Range 5 10) -- ruleLastTime too eager
diff --git a/tests/Duckling/Time/SV/Tests.hs b/tests/Duckling/Time/SV/Tests.hs
--- a/tests/Duckling/Time/SV/Tests.hs
+++ b/tests/Duckling/Time/SV/Tests.hs
@@ -46,6 +46,6 @@
     ctx = testContext {locale = makeLocale SV Nothing}
     dims = HashSet.singleton $ This Time
     check :: Example -> IO ()
-    check (input, predicate) = case analyze input ctx dims of
+    check (input, predicate) = case analyze input ctx testOptions dims of
       [] -> assertFailure $ "empty result on " ++ show input
       xs -> mapM_ (assertBool ("predicate on " ++ show input) . predicate ctx) xs
diff --git a/tests/Duckling/Time/Tests.hs b/tests/Duckling/Time/Tests.hs
--- a/tests/Duckling/Time/Tests.hs
+++ b/tests/Duckling/Time/Tests.hs
@@ -75,7 +75,7 @@
 
 timeFormatTest :: TestTree
 timeFormatTest = testCase "Format Test" $
-  mapM_ (analyzedFirstTest testContext . withTargets [This Time]) xs
+  mapM_ (analyzedFirstTest testContext testOptions . withTargets [This Time]) xs
   where
     xs = examplesCustom (parserCheck expected parseValue) ["now"]
     expected = "2013-02-12T04:30:00.000-02:00"
diff --git a/tests/Duckling/Url/Tests.hs b/tests/Duckling/Url/Tests.hs
--- a/tests/Duckling/Url/Tests.hs
+++ b/tests/Duckling/Url/Tests.hs
@@ -32,7 +32,7 @@
 
 surroundTests :: TestTree
 surroundTests = testCase "Surround Tests" $
-  mapM_ (analyzedFirstTest testContext . withTargets [This Url]) xs
+  mapM_ (analyzedFirstTest testContext testOptions . withTargets [This Url]) xs
   where
     xs = examples (UrlData "www.lets-try-this-one.co.uk/episode-7" "lets-try-this-one.co.uk")
                   [ "phishing link: www.lets-try-this-one.co.uk/episode-7  If you want my job"
